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)