浅谈NumPy中的维度Axis
NumPy中的维度是一个很重要的概念,很多函数的参数都需要给定维度Axis,如何直观的理解维度呢?我们首先以二维数组为例进行说明,然后推广到多维数组。
(有人将ndim属性叫维度,将axis叫轴,我还是习惯将axis称之为维度,axis=0称为第一个维度)
二维数组的列子
import numpy as np x = np.random.randint(0, 9, (2, 3)) x Out[4]: array([[6, 5, 2], [0, 6, 7]]) x.ndim Out[5]: 2 x.shape Out[6]: (2, 3) x[0] Out[7]: array([6, 5, 2]) x[:, 0] Out[8]: array([6, 0]) x.sum(axis=0) Out[9]: array([ 6, 11, 9]) x.sum(axis=1) Out[10]: array([13, 13])
看上面这个例子,x是一个2行3列的数组,所以x是一个二维数组。
从第6和第7个输入输出,我们可以肯定地说"对于二维数组,第一维指的是行,第二维指的是列"。
我们通过sum求和函数,探究一下x的第一维和第二维的意义?从第8个和第9个输入输出,我们可以看到对于参数axis=0,其结果是数组列的和;而对于参数axis=1,其参数是数组行的和。
对于axis=0第一个维度求和,不是将第一维度(行)中的所有元素相加,而是沿着第一个维度,将对应其他维度(列)的数据相加,分解开来就是第10个输入输出。同理,对于axis=1,是沿着列,将行中的元素相加。
NumPy中对于维度的操作都是以类似这样的逻辑操作的。
所以,我的结论就是:在概念上维度是从整体到局部看的,最外围的是第一个维度,然后依次往里,最内部的就是最后一维。
np.stack
numpy.stack(arrays, axis=0)
沿着新轴连接数组的序列。
axis参数指定新轴在结果尺寸中的索引。例如,如果axis=0,它将是第一个维度,如果axis=-1,它将是最后一个维度。
参数: 数组:array_like的序列每个数组必须具有相同的形状。axis:int,可选输入数组沿其堆叠的结果数组中的轴。
返回: 堆叠:ndarray堆叠数组比输入数组多一个维。
import numpy as np a = np.random.randint(0, 9, (2, 3)) a Out[32]: array([[0, 0, 4], [2, 4, 3]]) b = np.stack([a, a], axis=0) b[0] == a Out[34]: array([[ True, True, True], [ True, True, True]]) b.shape Out[35]: (2, 2, 3) b = np.stack([a, a], axis=1) b.shape Out[37]: (2, 2, 3) b[:,0,:] == a Out[38]: array([[ True, True, True], [ True, True, True]]) b = np.stack([a, a], axis=2) b[: ,:, 0] == a Out[40]: array([[ True, True, True], [ True, True, True]]) b.shape Out[41]: (2, 3, 2)
当从axis=0维度进行堆叠时,则a[i]相当于堆叠的第i个array
当从axis=1维度进行堆叠时,则a[:,i,:]相当于堆叠的第i个array
当从axis=2维度进行堆叠时,则a[:,:,i]相当于堆叠的第i个array。
例如:
当有(B, C)维度大小的arr需要对每一行的数据重复R次,生成(B,R,C)维度的数据时,就用
np.stack([a] * R, axis=1)
np.concatenate()
numpy.concatenate((a1, a2, ...), axis=0) # 按维度拼接,如3x5的arr与5x5的矩阵拼接为8x5的矩阵
a = np.zeros((3,4)) b = np.ones((2, 4)) c = np.concatenate([a, b], axis=0) c.shape Out[50]: (5, 4)