python学习笔记五:numpy

ndarray是一个多维数组的数据结构

1.彩色图像是一个三维数组,通过matplotlib显示图像

#显示图像
import numpy as np
import matplotlib.pyplot as plt

fish = plt.imread('HappyFish.jpg')
print(fish.shape)
print(type(fish))
运行结果:
(194, 259, 3)
<class 'numpy.ndarray'>

plt.subplot(1,2,1)
plt.imshow(fish)

fish2 = fish - 2
plt.subplot(1,2,2)
plt.imshow(fish2)

 2.使用np.arrray创建数组

#一维数组
n1 = np.array([3,1,4,5])

#二维数组
n2 = np.array([[2,3,4,5],[3,4,6,7],[4,6,7,8]])

#三维数组
n3 = np.array([[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]])

3.使用list,ones,zeros,full,eye,linspace,arange创建数组

#使用列表创建np.array
#如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
n4 = np.array([1,2.5,'python'])

#通过ones创建二维数组
#Shift+Tab查看方法的参数
np.ones((3,4),dtype = int)

#通过ones创建三维数组
ones = np.ones((100,80,3),dtype=float)

#通过zeros生成0数组
zeros = np.zeros((100,80,3),dtype=float)


#生成指定数字填充的数组
np.full((3,4),fill_value=6)

#生成单位数组
np.eye(3)

#使用线性等分生成数组lin=linear
np.linspace(1,9,5)

#按步长生成数组,左闭右开
np.arange(1,7,3)

4.使用randint,,randn,normal,random生成随机数组

#生成随机整数的数组
np.random.randint(0,10,5)

#生成正态分布的数组,以0为锚点
np.random.randn(20)

#以自定义锚点为中心生成正态分布,scale波动系数
np.random.normal(loc = 175,scale = 1,size =10)

#生成0到1的随机数组
np.random.random(size = (4,4,3))

5.数组索引

#二维索引
n2 = np.random.randint(0,100,(3,4))
n1[1,3]

#多维索引
n5 = np.random.randint(0,100,(3,4,5))
n5[1,3,2]

6.数组的切片

#数组的切片,切片时左闭右开
n2 = np.random.randint(0,10,size = 10)
n2[0:5]

#三维数组的切片
n3 = np.random.randint(0,10,(3,4,3))
n3[0:2,0:2,0:2]

7.数组的翻转与排序

#数组的翻转,排序
n1 = np.arange(0,10,1)
print(n1[::2])#正着取,步长为2,第一个冒号代表切片
print(n1[::-1])#反着取,步长为1
n1.sort()#从小到大排序

8.数组的变形

#变形
n1 = np.arange(0,10,1)
n2 = n1.reshape((5,2))

#将3维图像变形为1维
import matplotlib.pyplot as plt
fish = plt.imread('HappyFish.jpg')
print(fish.shape)
fish_1D = fish.reshape(194*259*3)#fish.reshape(-1)也可以直接转变为1维

9.级联

n1 = np.random.randint(0,10,(5,5))
print(n1)
np.concatenate((n1,n1))#按行级联
np.concatenate((n1,n1),axis = 1)#按列级联

#np.hstack水平及联np.vstack垂直级联,自己处理自己
#水平级联
n1 = np.array([[1,2,3],[2,3,4],[3,4,5]])
n2 = np.hstack(n1)

#垂直级联
n1 = np.arange(0,10,1)
n2 = np.vstack(n1)

#三维数组的级联
fish0 = np.concatenate((fish,fish))#默认axis = 0,即按行连接
plt.subplot(1,2,1)
plt.imshow(fish0)

fish1 = np.concatenate((fish,fish),axis = 1)#axis = 1,按列连接
plt.subplot(1,2,2)
plt.imshow(fish1)

10.切分 

与级联类似,三个函数完成切分工作:
np.split
np.vsplit
np.hsplit

n5 = np.random.randint(0,10,size = (5,5))
print(n5)
print(np.split(n5,(1,3)))#axis默认为0,按行切分
print(np.split(n5,(1,3),axis = 1))#axis为1时按列切分

#三维数组的切分
fish2 =  np.split(fish,(97,194))[0]#按行切,去切分后的第一部分
plt.subplot(1,2,1)
plt.imshow(fish2)

fish3 = np.split(fish,(130,259),axis = 1)[1]#按列切,去切分后的中间部分
plt.subplot(1,2,2)
plt.imshow(fish3)

11.副本

#当数据是ndarray类型时,对赋值后的对象的操作也对原对象生效,相当于引用同一地址,并没有创建副本。可通过np.copy来创建副本

l = [1,2,3,4]
n1 = np.array(l)
print(n1)
n2 = n1
n2[2] = 5
print(n2)
print(n1)
运行结果:
[1 2 3 4]
[1 2 5 4]
[1 2 5 4]

n1 = np.arange(1,5,1)
print(n1)
n2 = np.copy(n1)
n2[2] = 5
print(n2)
print(n1)
运行结果:
[1 2 3 4]
[1 2 5 4]
[1 2 3 4]

12.ndarray的聚合操作

求和np.sum
求最大值np.max
求最小值np.min
求平均值np.mean
找出符合条件值的索引np.argwhere¶
求最大值的索引np.argmax
求最小值的索引np.argmin

#一维
n1 = np.arange(0,10,1)
print(n1)
print(np.sum(n1))
print(np.max(n1))
print(np.min(n1))
print(np.mean(n1))

#三维
n3 = np.random.randint(0,10,size = (4,4,3))
print(n3)
print(np.max(n3,axis = 0))#当axis=0时看第1维,axis=1时,看第2维,axis=2时,看第3维
print(np.min(n3,axis = 1))
print(np.sum(n3,axis = 0))
print(np.mean(n3,axis = 1))

#求索引
n1 = np.random.randint(0,10,size = 10)
print(n1)
#最大最小值索引
print(np.argmin(n1))
print(np.argmax(n1))
#符合条件值的索引
index = np.argwhere(n1>5)
print(index)
n1[index]

13.数组的矩阵操作

#数组的加减乘除,每个元素都对应加减乘除
n = np.random.randint(0,10,size=(2,3))
print(n)
print(n+10)
print(n*2)

#矩阵对应元素加减乘
print(np.add(n,n))#矩阵对应元素相加
print(np.subtract(n,n))#矩阵对应元素相减
print(np.multiply(n,n))#矩阵对应元素相乘 
print(np.divide(n,n))#矩阵对应元素相乘除

#矩阵乘积
n1 = np.random.randint(0,10,size = (2,3))
n2 = np.random.randint(0,10,size = (3,2))
np.dot(n1,n2)

14.数组的排序

np.sort()与ndarray.sort()都可以,但有区别:
np.sort()不改变原来数组,重新创建一个对象
ndarray.sort()改变原来数组,本地处理,不占用空间
部分排序np.partition(a,k):
当k为正时,我们想要得到最小的k个数
当k 为负时,我们想要得到最大的k个数


#定义冒泡排序方法
def sortn(nd):
    for i in range(nd.size):
        for j in range(i+1,nd.size):
            if(nd[j] < nd[i]) :
                nd[i],nd[j] =nd[j],nd[i]
    return nd

#利用一个for循环实现排序,降低复杂度
def sortnd(nd):
    for i in range(nd.size):
        min_index = np.argmin(nd[i:]) + i
        nd[min_index],nd[i] = nd[i],nd[min_index]
    return nd

#利用python里封装好的方法进行排序
n1 = np.random.randint(0,10,size=10)
np.sort(n1) #np.sort(),原来数据没有改变,重新创建了一个对象
n1.sort()#没有return即没有返回,ndarray.sort(),原来的数据进行了改变

#部分排序
n1 = np.random.randint(0,100,size = 20)
np.partition(n1,5)#得到最小的5个数,后面的数没有排序
np.partition(n1,5)[:5]#得到最小的5个数
np.partition(n1,-5)[-5:]#得到最大的5个数

15.ndarray应用实例

import matplotlib.pyplot as plt
fish = plt.imread('HappyFish.jpg')
plt.subplot(2,2,1)
plt.imshow(fish)

#水平方向上颠倒
fish1 = fish[::-1]
plt.subplot(2,2,2)
plt.imshow(fish1)

#既在水平方向上颠倒,又在竖直方向上颠倒
fish2 = fish[::-1,::-1]
plt.subplot(2,2,3)
plt.imshow(fish2)
         
#前两维不颠倒,第三位颠倒,即将颜色颠倒,红的变蓝
fish3 = fish[::,::,::-1]
plt.subplot(2,2,4)
plt.imshow(fish3)   

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/83374096