索引
副本和视图
在 Numpy 中,尤其是在做数组运算或数组操作时,返回结果不是数组的副本就是视图。
在 Numpy 中,所有赋值运算不会为数组和数组中的任何元素创建副本。
- numpy.ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
importnumpyasnp x=np.array([1,2,3,4,5,6,7,8])print(x)#[1 2 3 4 5 6 7 8]y=x y[0]=-1print(y)#[-1 2 3 4 5 6 7 8]x=np.array([1,2,3,4,5,6,7,8])y=x.copy()y[0]=-1print(x)#[1 2 3 4 5 6 7 8]print(y)#[-1 2 3 4 5 6 7 8]数组切片操作返回的对象只是原数组的视图。
索引和切片
数组索引机制指的是用方括号([])加序号的形式引用单个数组元素,它的用处很多,比如抽取元素,选取数组的几个元素,甚至为其赋一个新值。
整数索引
要获取数组的单个元素,指定元素的索引即可。
importnumpyasnp x=np.array([1,2,3,4,5,6,7,8])print(x[2])#3x=np.arange(11,36).reshape((5,5))print(x[2])#[21 22 23 24 25]print(x[2][1])#22print(x[2,1])#22切片索引
切片操作是指抽取数组的一部分元素生成新数组。对 python列表进行切片操作得到的数组是原数组的副本,而对Numpy数据进行切片操作得到的数组则是指向相同缓冲区的图。
如果想抽取(或查看)数组的一部分,必须使用切片语法,也就是,把几个用冒号(start:stop:step)隔开的数字置于方括号内。
importnumpyasnp x=np.array([1,2,3,4,5,6,7,8])print(x[0:2])#[1 2]print(x[1:5:2])#[2 4]print(x[:2])#[1 2]print(x[2:])#[3 4 5 6 7 8]print(x[-2:])#[7 8]print(x[:-2])#[1 2 3 4 5 6]print(x[:])#[1 2 3 4 5 6 7 8]print(x[::-1])#[8 7 6 5 4 3 2 1]y=np.arange(11,36).reshape((5,5))print(y[0:2])#[[11 12 13 14 15]# [16 17 18 19 20]]print(y[1:5:2])#[[16 17 18 19 20]# [26 27 28 29 30]]print(y[:2])#[[11 12 13 14 15]# [16 17 18 19 20]]print(y[2:])#[[21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]print(y[:-2])#[[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]]print(y[-2:])#[[26 27 28 29 30]# [31 32 33 34 35]]print(y[:])#[[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]print(y[2,:])#[21 22 23 24 25]print(y[:,2])#[13 18 23 28 33]print(y[0,1:4])#[12 13 14]print(y[1:4,0])#[16 21 26]print(y[1:3,2:4])#[[18 19]# [23 24]]print(y[:,:])#[[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]print(y[::2,::2])#[[11 13 15]# [21 23 25]# [31 33 35]]print(y[::-1,:])#[[31 32 33 34 35]# [26 27 28 29 30]# [21 22 23 24 25]# [16 17 18 19 20]# [11 12 13 14 15]]print(y[:,::-1])#[[15 14 13 12 11]# [20 19 18 17 16]# [25 24 23 22 21]# [30 29 28 27 26]# [35 34 33 32 31]]通过对每个以逗号分隔的维度执行单独的切片,你可以对多维数组进行切片。因此,对于二维数组,我们的第一片定义了行的切片,第二片定义了列的切片。
importnumpyasnp x=np.arange(11,36).reshape((5,5))print(x)#[[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]x[0::2,1::3]=0print(x)#[[11 0 13 14 0]# [16 17 18 19 20]# [21 0 23 24 0]# [26 27 28 29 30]# [31 0 33 34 0]]dots索引
NumPy 允许使用…表示足够多的冒号来构建完整的索引列表。
比如,如果 x 是 5 维数组:
- x[1,2,…] 等于 x[1,2,:,:,:]
- x[…,3] 等于 x[:,:,:,:,3]
- x[4,…,5,:] 等于 x[4,:,:,5,:]
importnumpyasnp x=np.random.randint(1,100,[2,2,3])print(x)#[[[57 19 29]# [42 21 60]]## [[39 6 10]# [45 23 74]]]print(x[1,...])#[[39 6 10]# [45 23 74]]print(x[...,2])#[[29 60]# [10 74]]整数数组索引
方括号内传入多个索引值,可以同时选择多个元素。
importnumpyasnp x=np.array([1,2,3,4,5,6,7,8])r=[0,1,2]print(x[r])# [1 2 3]r=[0,1,-1]print(x[r])# [1 2 8]x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])r=[0,1,2]print(x[r])# [[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]]r=[0,1,-1]print(x[r])# [[11 12 13 14 15]# [16 17 18 19 20]# [31 32 33 34 35]]r=[0,1,2]c=[2,3,4]y=x[r,c]print(y)# [13 19 25]x=np.array([1,2,3,4,5,6,7,8])r=np.array([[0,1],[3,4]])print(x[r])# [[1 2]# [4 5]]x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])r=np.array([[0,1],[3,4]])print(x[r])# [[[11 12 13 14 15]# [16 17 18 19 20]]## [[26 27 28 29 30]# [31 32 33 34 35]]]# 获取了 5X5 数组中的四个角的元素。# 行索引是 [0,0] 和 [4,4],而列索引是 [0,4] 和 [0,4]。r=np.array([[0,0],[4,4]])c=np.array([[0,4],[0,4]])y=x[r,c]print(y)# [[11 15]# [31 35]]可以借助切片:与整数数组组合。
importnumpyasnp x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])y=x[0:3,[1,2,2]]print(y)# [[12 13 13]# [17 18 18]# [22 23 23]]numpy. take(a, indices, axis=None, out=None, mode=‘raise’) 沿某一轴从数组中提取元素。
importnumpyasnp x=np.array([1,2,3,4,5,6,7,8])r=[0,1,2]print(np.take(x,r))# [1 2 3]r=[0,1,-1]print(np.take(x,r))# [1 2 8]x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])r=[0,1,2]print(np.take(x,r,axis=0))# [[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]]r=[0,1,-1]print(np.take(x,r,axis=0))# [[11 12 13 14 15]# [16 17 18 19 20]# [31 32 33 34 35]]r=[0,1,2]c=[2,3,4]y=np.take(x,[r,c])print(y)# [[11 12 13]# [13 14 15]]应注意:使用切片索引到numpy数组时,生成的数组视图将始终是原始数组的子数组, 但是整数数组索引,不是其子数组,是形成新的数组。 切片索引
布尔索引
我们可以通过一个布尔数组来索引目标数组。
importnumpyasnp x=np.array([1,2,3,4,5,6,7,8])y=x>5print(y)# [False False False False False True True True]print(x[x>5])# [6 7 8]x=np.array([np.nan,1,2,np.nan,3,4,5])y=np.logical_not(np.isnan(x))print(x[y])# [1. 2. 3. 4. 5.]x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])y=x>25print(y)# [[False False False False False]# [False False False False False]# [False False False False False]# [ True True True True True]# [ True True True True True]]print(x[x>25])# [26 27 28 29 30 31 32 33 34 35]数组迭代
除了for循环,Numpy 还提供另外一种更为优雅的遍历方法。
apply_along_axis(func1d, axis, arr) 沿给定轴对一维切片应用函数。
importnumpyasnp x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])y=np.apply_along_axis(np.sum,0,x)print(y)# [105 110 115 120 125]y=np.apply_along_axis(np.sum,1,x)print(y)# [ 65 90 115 140 165]y=np.apply_along_axis(np.mean,0,x)print(y)# [21. 22. 23. 24. 25.]y=np.apply_along_axis(np.mean,1,x)print(y)# [13. 18. 23. 28. 33.]defmy_func(x):return(x[0]+x[-1])*0.5y=np.apply_along_axis(my_func,0,x)print(y)# [21. 22. 23. 24. 25.]y=np.apply_along_axis(my_func,1,x)print(y)# [13. 18. 23. 28. 33.]数组操作
更改形状
在对数组进行操作时,为了满足格式和计算的要求通常会改变其形状。
1、numpy.ndarray.shape表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即ndim 属性(秩)。
importnumpyasnp x=np.array([1,2,9,4,5,6,7,8])print(x.shape)# (8,)x.shape=[2,4]print(x)# [[1 2 9 4]# [5 6 7 8]]2、numpy.ndarray.flat 将数组转换为一维的迭代器,可以用for访问数组每一个元素。
importnumpyasnp x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])y=x.flatprint(y)# <numpy.flatiter object at 0x0000020F9BA10C60>foriiny:print(i,end=' ')# 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35y[3]=0print(end='\n')print(x)# [[11 12 13 0 15]# [16 17 18 19 20]# [21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]3、numpy.ndarray.flatten([order=‘C’]) 将数组的副本转换为一维数组,并返回。
- order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。(简记)
- order:{'C / F,'A,K},可选使用此索引顺序读取a的元素。'C’意味着以行大的C风格顺序对元素进行索引,最后一个轴索引会更改F表示以列大的Fortran样式顺序索引元素,其中第一个索引变化最快,最后一个索引变化最快。请注意,'C’和’F’选项不考虑基础数组的内存布局,仅引用轴索引的顺序.A’表示如果a为Fortran,则以类似Fortran的索引顺序读取元素在内存中连续,否则类似C的顺序。“ K”表示按照步序在内存中的顺序读取元素,但步幅为负时反转数据除外。默认情况下,使用Cindex顺序。
flatten()函数返回的是拷贝
importnumpyasnp x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])y=x.flatten()print(y)# [11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34# 35]y[3]=0print(x)# [[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])y=x.flatten(order='F')print(y)# [11 16 21 26 31 12 17 22 27 32 13 18 23 28 33 14 19 24 29 34 15 20 25 30# 35]y[3]=0print(x)# [[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]4、numpy.ravel(a, order=‘C’) 返回一个连续的展平数组。
ravel()返回的是视图。
importnumpyasnp x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])y=np.ravel(x)print(y)# [11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34# 35]y[3]=0print(x)# [[11 12 13 0 15]# [16 17 18 19 20]# [21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]order=F 就是拷贝
x=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])y=np.ravel(x,order='F')print(y)# [11 16 21 26 31 12 17 22 27 32 13 18 23 28 33 14 19 24 29 34 15 20 25 30# 35]y[3]=0print(x)# [[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]# [26 27 28 29 30]# [31 32 33 34 35]]5、numpy.reshape(a, newshape[, order=‘C’]) 在不更改数据的情况下为数组赋予新的形状。
reshape() 函数当参数 newshape = [rows,-1] 时,将根据行数自动确定列数。
importnumpyasnp x=np.arange(12)y=np.reshape(x,[3,4])print(y.dtype)# int32print(y)# [[ 0 1 2 3]# [ 4 5 6 7]# [ 8 9 10 11]]y=np.reshape(x,[3,-1])print(y)# [[ 0 1 2 3]# [ 4 5 6 7]# [ 8 9 10 11]]y=np.reshape(x,[-1,3])print(y)# [[ 0 1 2]# [ 3 4 5]# [ 6 7 8]# [ 9 10 11]]y[0,1]=10print(x)# [ 0 10 2 3 4 5 6 7 8 9 10 11](改变x去reshape后y中的值,x对应元素也改变)reshape()函数当参数newshape = -1时,表示将数组降为一维。
importnumpyasnp x=np.random.randint(12,size=[2,2,3])print(x)# [[[11 9 1]# [ 1 10 3]]## [[ 0 6 1]# [ 4 11 3]]]y=np.reshape(x,-1)print(y)# [11 9 1 1 10 3 0 6 1 4 11 3]数组转置
numpy.transpose(a, axes=None) 对数组的维度进行置换。
numpy.ndarray.T 与 self.transpose() 相同,但如果 self.ndim < 2,则返回 self。
importnumpyasnp x=np.random.rand(5,5)*10x=np.around(x,2)print(x)# [[6.74 8.46 6.74 5.45 1.25]# [3.54 3.49 8.62 1.94 9.92]# [5.03 7.22 1.6 8.7 0.43]# [7.5 7.31 5.69 9.67 7.65]# [1.8 9.52 2.78 5.87 4.14]]y=x.Tprint(y)# [[6.74 3.54 5.03 7.5 1.8 ]# [8.46 3.49 7.22 7.31 9.52]# [6.74 8.62 1.6 5.69 2.78]# [5.45 1.94 8.7 9.67 5.87]# [1.25 9.92 0.43 7.65 4.14]]y=np.transpose(x)print(y)# [[6.74 3.54 5.03 7.5 1.8 ]# [8.46 3.49 7.22 7.31 9.52]# [6.74 8.62 1.6 5.69 2.78]# [5.45 1.94 8.7 9.67 5.87]# [1.25 9.92 0.43 7.65 4.14]]更改维度
当创建一个数组之后,还可以给它增加一个维度,这在矩阵计算中经常会用到。
1、numpy.newaxis = None None的别名,对索引数组很有用
很多工具包在进行计算时都会先判断输入数据的维度是否满足要求,如果输入数据达不到指定的维度时,可以使用newaxis参数来增加一个维度。
importnumpyasnp x=np.array([1,2,9,4,5,6,7,8])print(x.shape)# (8,)print(x)# [1 2 9 4 5 6 7 8]y=x[np.newaxis,:]print(y.shape)# (1, 8)print(y)# [[1 2 9 4 5 6 7 8]]y=x[:,np.newaxis]print(y.shape)# (8, 1)print(y)# [[1]# [2]# [9]# [4]# [5]# [6]# [7]# [8]]2、numpy.squeeze(a, axis=None) 从数组的形状中删除单维度条目,即把shape中为1的维度去掉。
a表示输入的数组;
axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
在机器学习和深度学习中,通常算法的结果是可以表示向量的数组(即包含两对或以上的方括号形式[[]]),如果直接利用这个数组进行画图可能显示界面为空(见后面的示例)。我们可以利用squeeze()函数将表示向量的数组转换为秩为1的数组,这样利用 matplotlib 库函数画图时,就可以正常的显示结果了。
importnumpyasnp x=np.arange(10)print(x.shape)# (10,)x=x[np.newaxis,:]print(x.shape)# (1, 10)y=np.squeeze(x)print(y.shape)# (10,)importnumpyasnp x=np.array([[[0],[1],[2]]])print(x.shape)# (1, 3, 1)print(x)# [[[0]# [1]# [2]]]y=np.squeeze(x)print(y.shape)# (3,)print(y)# [0 1 2]y=np.squeeze(x,axis=0)print(y.shape)# (3, 1)print(y)# [[0]# [1]# [2]]y=np.squeeze(x,axis=2)print(y.shape)# (1, 3)print(y)# [[0 1 2]]y=np.squeeze(x,axis=1)# ValueError: cannot select an axis to squeeze out which has size not equal to one数组组合
如果要将两份数据组合到一起,就需要拼接操作。
numpy.concatenate((a1, a2, …), axis=0, out=None) 沿现有轴将一系列数组连接起来。
连接沿现有轴的数组序列(原来x,y都是一维的,拼接后的结果也是一维的)
importnumpyasnp x=np.array([1,2,3])y=np.array([7,8,9])z=np.concatenate([x,y])print(z)# [1 2 3 7 8 9]z=np.concatenate([x,y],axis=0)print(z)# [1 2 3 7 8 9]原来x,y都是二维的,拼接后的结果也是二维的。
importnumpyasnp x=np.array([1,2,3]).reshape(1,3)y=np.array([7,8,9]).reshape(1,3)z=np.concatenate([x,y])print(z)# [[ 1 2 3]# [ 7 8 9]]z=np.concatenate([x,y],axis=0)print(z)# [[ 1 2 3]# [ 7 8 9]]z=np.concatenate([x,y],axis=1)print(z)# [[ 1 2 3 7 8 9]]x,y在原来的维度上进行拼接。
importnumpyasnp x=np.array([[1,2,3],[4,5,6]])y=np.array([[7,8,9],[10,11,12]])z=np.concatenate([x,y])print(z)# [[ 1 2 3]# [ 4 5 6]# [ 7 8 9]# [10 11 12]]z=np.concatenate([x,y],axis=0)print(z)# [[ 1 2 3]# [ 4 5 6]# [ 7 8 9]# [10 11 12]]z=np.concatenate([x,y],axis=1)print(z)# [[ 1 2 3 7 8 9]# [ 4 5 6 10 11 12]]numpy.stack(arrays, axis=0, out=None) 沿新轴将一系列数组连接起来。
沿着新的轴加入一系列数组(stack为增加维度的拼接)。
importnumpyasnp x=np.array([1,2,3])y=np.array([7,8,9])z=np.stack([x,y])print(z.shape)# (2, 3)print(z)# [[1 2 3]# [7 8 9]]z=np.stack([x,y],axis=1)print(z.shape)# (3, 2)print(z)# [[1 7]# [2 8]# [3 9]]numpy.vstack(tup) 将数组按顺序垂直堆叠(即按行堆叠)。
numpy.hstack(tup) 将数组按顺序水平堆叠(即按列堆叠)。
一维的情况。
importnumpyasnp x=np.array([1,2,3])y=np.array([7,8,9])z=np.vstack((x,y))print(z.shape)# (2, 3)print(z)# [[1 2 3]# [7 8 9]]z=np.stack([x,y])print(z.shape)# (2, 3)print(z)# [[1 2 3]# [7 8 9]]z=np.hstack((x,y))print(z.shape)# (6,)print(z)# [1 2 3 7 8 9]z=np.concatenate((x,y))print(z.shape)# (6,)print(z)# [1 2 3 7 8 9]二维的情况。
importnumpyasnp x=np.array([1,2,3]).reshape(1,3)y=np.array([7,8,9]).reshape(1,3)z=np.vstack((x,y))print(z.shape)# (2, 3)print(z)# [[1 2 3]# [7 8 9]]z=np.concatenate((x,y),axis=0)print(z.shape)# (2, 3)print(z)# [[1 2 3]# [7 8 9]]z=np.hstack((x,y))print(z.shape)# (1, 6)print(z)# [[ 1 2 3 7 8 9]]z=np.concatenate((x,y),axis=1)print(z.shape)# (1, 6)print(z)# [[1 2 3 7 8 9]]importnumpyasnp x=np.array([[1,2,3],[4,5,6]])y=np.array([[7,8,9],[10,11,12]])z=np.vstack((x,y))print(z.shape)# (4, 3)print(z)# [[ 1 2 3]# [ 4 5 6]# [ 7 8 9]# [10 11 12]]z=np.concatenate((x,y),axis=0)print(z.shape)# (4, 3)print(z)# [[ 1 2 3]# [ 4 5 6]# [ 7 8 9]# [10 11 12]]z=np.hstack((x,y))print(z.shape)# (2, 6)print(z)# [[ 1 2 3 7 8 9]# [ 4 5 6 10 11 12]]z=np.concatenate((x,y),axis=1)print(z.shape)# (2, 6)print(z)# [[ 1 2 3 7 8 9]# [ 4 5 6 10 11 12]]hstack(),vstack()分别表示水平和竖直的拼接方式。在数据维度等于1时,比较特殊。而当维度大于或等于2时,它们的作用相当于concatenate,用于在已有轴上进行操作。
importnumpyasnp a=np.hstack([np.array([1,2,3,4]),5])print(a)# [1 2 3 4 5]a=np.concatenate([np.array([1,2,3,4]),5])print(a)# all the input arrays must have same number of dimensions, but the array at index 0 has 1 dimension(s) and the array at index 1 has 0 dimension(s)数组拆分
numpy.split(ary, indices_or_sections, axis=0) 将一个数组拆分为多个子数组,作为对数组的视图。
importnumpyasnp x=np.array([[11,12,13,14],[16,17,18,19],[21,22,23,24]])y=np.split(x,[1,3])print(y)# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]y=np.split(x,[1,3],axis=1)print(y)# [array([[11],# [16],# [21]]), array([[12, 13],# [17, 18],# [22, 23]]), array([[14],# [19],# [24]])]numpy.vsplit(ary, indices_or_sections) 将一个数组垂直(按行)拆分为多个子数组。
importnumpyasnp x=np.array([[11,12,13,14],[16,17,18,19],[21,22,23,24]])y=np.vsplit(x,3)print(y)# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19]]), array([[21, 22, 23, 24]])]y=np.split(x,3)print(y)# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19]]), array([[21, 22, 23, 24]])]y=np.vsplit(x,[1])print(y)# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],# [21, 22, 23, 24]])]y=np.split(x,[1])print(y)# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],# [21, 22, 23, 24]])]y=np.vsplit(x,[1,3])print(y)# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]y=np.split(x,[1,3],axis=0)print(y)# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]numpy.hsplit(ary, indices_or_sections) 将一个数组水平(按列)拆分为多个子数组。
importnumpyasnp x=np.array([[11,12,13,14],[16,17,18,19],[21,22,23,24]])y=np.hsplit(x,2)print(y)# [array([[11, 12],# [16, 17],# [21, 22]]), array([[13, 14],# [18, 19],# [23, 24]])]y=np.split(x,2,axis=1)print(y)# [array([[11, 12],# [16, 17],# [21, 22]]), array([[13, 14],# [18, 19],# [23, 24]])]y=np.hsplit(x,[3])print(y)# [array([[11, 12, 13],# [16, 17, 18],# [21, 22, 23]]), array([[14],# [19],# [24]])]y=np.split(x,[3],axis=1)print(y)# [array([[11, 12, 13],# [16, 17, 18],# [21, 22, 23]]), array([[14],# [19],# [24]])]y=np.hsplit(x,[1,3])print(y)# [array([[11],# [16],# [21]]), array([[12, 13],# [17, 18],# [22, 23]]), array([[14],# [19],# [24]])]y=np.split(x,[1,3],axis=1)print(y)# [array([[11],# [16],# [21]]), array([[12, 13],# [17, 18],# [22, 23]]), array([[14],# [19],# [24]])]数据平铺
numpy.tile(A, reps) 根据reps给出的次数重复A来构造一个数组。tile是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来。
importnumpyasnp x=np.array([[1,2],[3,4]])print(x)# [[1 2]# [3 4]]y=np.tile(x,(1,3))print(y)# [[1 2 1 2 1 2]# [3 4 3 4 3 4]]y=np.tile(x,(3,1))print(y)# [[1 2]# [3 4]# [1 2]# [3 4]# [1 2]# [3 4]]y=np.tile(x,(3,3))print(y)# [[1 2 1 2 1 2]# [3 4 3 4 3 4]# [1 2 1 2 1 2]# [3 4 3 4 3 4]# [1 2 1 2 1 2]# [3 4 3 4 3 4]]numpy.repeat(a, repeats, axis=None) 数组中的重复元素
axis=0,沿着y轴复制,实际上增加了行数。axis=1,沿着x轴复制,实际上增加了列数。repeats,可以为一个数,也可以为一个矩阵。axis=None时就会flatten当前矩阵,实际上就是变成了一个行向量。
importnumpyasnp x=np.repeat(3,4)print(x)# [3 3 3 3]x=np.array([[1,2],[3,4]])y=np.repeat(x,2)print(y)# [1 1 2 2 3 3 4 4]y=np.repeat(x,2,axis=0)print(y)# [[1 2]# [1 2]# [3 4]# [3 4]]y=np.repeat(x,2,axis=1)print(y)# [[1 1 2 2]# [3 3 4 4]]y=np.repeat(x,[2,3],axis=0)print(y)# [[1 2]# [1 2]# [3 4]# [3 4]# [3 4]]y=np.repeat(x,[2,3],axis=1)print(y)# [[1 1 2 2 2]# [3 3 4 4 4]]添加和删除元素
numpy.unique(ar, return_index=False, return_inverse=False,return_counts=False, axis=None) 找出数组中的唯一元素。
return_index:输入数组中给出唯一值的索引
return_inverse:重构输入数组的唯一数组的索引
return_counts:输入数组中每个唯一值出现的次数
a=np.array([1,1,2,3,3,4,4])b=np.unique(a,return_counts=True)print(b[0][list(b[1]).index(1)])#2