数组操作 更改形状 在对数组进行操作时,为了满足格式和计算的要求通常会改变其形状。
numpy.ndarray.shape表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即ndim属性(秩)。
例:通过修改shape属性来改变数组的形状。
1 2 3 4 5 6 7 8 import numpy as npx = np.array([1 , 2 , 9 , 4 , 5 , 6 , 7 , 8 ]) print(x.shape) x.shape = [2 , 4 ] print(x)
numpy.ndarray.flat 将数组转换为一维的迭代器,可以用for访问数组每一个元组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import numpy as npx = 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.flat print(y) for i in y: print(i, end = ' ' ) y[3 ] = 0 print(x)
修改迭代器中的元素,原数组中对应元素也相应改变。
numpy.ndarray.flatten([order = ‘C’])将数组的副本转换为一维数组,并返回。
order:‘C’ — 按行,’F’—按列,’A’—原顺序,’K’—元素在内存中的出现顺序。
例:flatten()
函数返回的是拷贝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import numpy as npx = 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) y[3 ] = 0 print(x)
numpy.ravel(a, order = ‘C’) Return a contiguous flattened array.
例:ravel()
返回的是视图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import numpy as npx = 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) y[3 ] = 0 print(x)
例:order=F 就是拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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) y[3 ] = 0 print(x)
numpy.reshape(a, newshape[, order = ‘C’])在不更改数据的情况下为数组赋予新的形状。
例:reshape()
函数当参数newshape = [rows,-1]
时,将根据行数自动确定列数;newshape = [-1,column]
时,将根据行数自动确定行数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import numpy as npx = np.arange(12 ) y = np.reshape(x, [3 , 4 ]) print(y.dtype) print(y) y = np.reshape(x, [3 , -1 ]) print(y) y = np.reshape(x,[-1 ,3 ]) print(y) y[0 , 1 ] = 10 print(x)
例:reshape()
函数当参数newshape = -1
时,表示将数组降为一维。
1 2 3 4 5 6 7 8 9 10 11 12 import numpy as npx = np.random.randint(12 , size=[2 , 2 , 3 ]) print(x) y = np.reshape(x, -1 ) print(y)
数组转置
numpy.transpose(a, axes = None) Permute the dimensions of an array.
numpy.ndarray.T Same as self.transpose(),except that self is returned if self.ndim < 2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import numpy as npx = np.random.rand(5 , 5 ) * 10 x = np.around(x, 2 ) print(x) y = x.T print(y) y = np.transpose(x) print(y)
更改维度 当创建一个数组之后,还可以给它增加一个维度,这在矩阵计算中经常会用到。
numpy.newaxis = None None的别名,对索引数组很有用。
例:很多工具包在进行计算时都会先判断输入数据的维度是否满足要求,如果输入数据达不到指定的维度时,可以使用newaxis
参数来增加一个维度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import numpy as npx = np.array([1 , 2 , 9 , 4 , 5 , 6 , 7 , 8 ]) print(x.shape) print(x) y = x[np.newaxis, :] print(y.shape) print(y) y = x[:, np.newaxis] print(y.shape) print(y)
numpy.squeeze(a, axis = None) 从数组的形状中删除单维度条目,即把shape中为1的维度去掉。
a
表示输入的数组;
axis
用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
1 2 3 4 5 6 7 8 import numpy as npx = np.arange(10 ) print(x.shape) x = x[np.newaxis, :] print(x.shape) y = np.squeeze(x) print(y.shape)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import numpy as npx = np.array([[[0 ], [1 ], [2 ]]]) print(x.shape) print(x) y = np.squeeze(x) print(y.shape) print(y) y = np.squeeze(x, axis=0 ) print(y.shape) print(y) y = np.squeeze(x, axis=2 ) print(y.shape) print(y) y = np.squeeze(x, axis=1 )
数组组合 如果要将两份数据组合到一起,就需要拼接操作。
numpy.concatenate((a1, a2, …), axis = 0, out = None) Join a sequence of arrays along an existing axis.
例:连接沿现有轴的数组序列(原来x,y都是一维的,拼接后的结果也是一维的)
1 2 3 4 5 6 7 8 9 10 11 import numpy as npx = np.array([1 , 2 , 3 ]) y = np.array([7 , 8 , 9 ]) z = np.concatenate([x, y]) print(z) z = np.concatenate([x, y], axis=0 ) print(z)
例:原来x,y都是二维的,拼接后的结果也是二维的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import numpy as npx = np.array([1 , 2 , 3 ]).reshape(1 , 3 ) y = np.array([7 , 8 , 9 ]).reshape(1 , 3 ) z = np.concatenate([x, y]) print(z) z = np.concatenate([x, y], axis=0 ) print(z) z = np.concatenate([x, y], axis=1 ) print(z)
例:x,y在原来的维度上进行拼接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import numpy as npx = np.array([[1 , 2 , 3 ], [4 , 5 , 6 ]]) y = np.array([[7 , 8 , 9 ], [10 , 11 , 12 ]]) z = np.concatenate([x, y]) print(z) z = np.concatenate([x, y], axis=0 ) print(z) z = np.concatenate([x, y], axis=1 ) print(z)
numpy.stack(array, axis = 0, out = None) Join a sequence of arrays along a new axis.
例:沿着新的轴加入一系列数组(stack为增加维度的拼接)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import numpy as npx = np.array([1 , 2 , 3 ]) y = np.array([7 , 8 , 9 ]) z = np.stack([x, y]) print(z.shape) print(z) z = np.stack([x, y], axis=1 ) print(z.shape) print(z)
numpy.vstack(tup)
Stack arrays in sequence vertically (row wise).
numpy.hstack(tup)
Stack arrays in sequence horizontally (column wise).
hstack(),vstack()
分别表示水平和竖直的拼接方式。在数据维度等于1时,比较特殊。而当维度大于或等于2时,它们的作用相当于concatenate
,用于在已有轴上进行操作。
1 2 3 4 5 6 7 8 import numpy as npa = np.hstack([np.array([1 , 2 , 3 , 4 ]), 5 ]) print(a) a = np.concatenate([np.array([1 , 2 , 3 , 4 ]), 5 ]) print(a)
数组拆分
numpy.split(ary, indices_or_sections, axis = 0) Split an array into multiple sub-arrays as views into ary.
例:拆分数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import numpy as npx = np.array([[11 , 12 , 13 , 14 ], [16 , 17 , 18 , 19 ], [21 , 22 , 23 , 24 ]]) y = np.split(x, [1 , 3 ]) print(y) y = np.split(x, [1 , 3 ], axis=1 ) print(y)
numpy.vsplit(ary, indices_or_sections)
Split an array into multiple sub-arrays vertically (row-wise).
例:水平切分是把数组按照宽度切分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import numpy as npx = np.array([[11 , 12 , 13 , 14 ], [16 , 17 , 18 , 19 ], [21 , 22 , 23 , 24 ]]) y = np.vsplit(x, 3 ) print(y) y = np.vsplit(x, [1 ]) print(y) y = np.vsplit(x, [1 , 3 ]) print(y)
numpy.hsplit(ary, indices_or_sections)
Split an array into multiple sub-arrays horizontally (column-wise).
例:垂直切分是把数组按照高度切分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import numpy as npx = np.array([[11 , 12 , 13 , 14 ], [16 , 17 , 18 , 19 ], [21 , 22 , 23 , 24 ]]) y = np.hsplit(x, 2 ) print(y) y = np.hsplit(x, [3 ]) print(y) y = np.hsplit(x, [1 , 3 ]) print(y)
数组平铺
numpy.tile(A, reps)
Construct an array by repeating A the number of times given by reps.
tile
是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来。
例:将原矩阵横向、纵向地复制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import numpy as npx = np.array([[1 , 2 ], [3 , 4 ]]) print(x) y = np.tile(x, (1 , 3 )) print(y) y = np.tile(x, (3 , 1 )) print(y) y = np.tile(x, (3 , 3 )) print(y)
numpy.repeat(a, repeats, axis=None)
Repeat elements of an array.
axis=0
,沿着y轴复制,实际上增加了行数。
axis=1
,沿着x轴复制,实际上增加了列数。
repeats
,可以为一个数,也可以为一个矩阵。
axis=None
时就会flatten当前矩阵,实际上就是变成了一个行向量。
例:重复数组的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import numpy as npx = np.repeat(3 , 4 ) print(x) x = np.array([[1 , 2 ], [3 , 4 ]]) y = np.repeat(x, 2 ) print(y) y = np.repeat(x, 2 , axis=0 ) print(y) y = np.repeat(x, 2 , axis=1 ) print(y) y = np.repeat(x, [2 , 3 ], axis=0 ) print(y) y = np.repeat(x, [2 , 3 ], axis=1 ) print(y)
添加和删除元素
numpy.unique(ar, return_index=False, return_inverse=False,return_counts=False, axis=None)
Find the unique elements of an array
return_index:the indices of the input array that give the unique values
return_inverse:the indices of the unique array that reconstruct the input array
return_counts:the number of times each unique value comes up in the input array
例:查找数组的唯一元素。
1 2 3 4 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 )])