numpy:维度问题

浅谈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)

 

posted @ 2020-03-02 22:48  纯洁的小兄弟  阅读(1234)  评论(0编辑  收藏  举报