背景
使用Pytorch进行学习,少不了跟numpy打交道,比如数据集中去除通道reduction只有做加法运算等,但是numpy轴操作,很少有人讲清楚,此处加以梳理。
轴的概念
轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸
如果是3维及以上的多维数组,先最外层,然后一层一层按照先横轴再纵轴的逻辑进行匹配轴。(实际2维只是多维的特殊情况,也是从最外层开始,一层层先横轴再纵轴 )
如下图所示:
上面的图只是一个方便理解的图示方法,展示了轴的概念,最后一个图例(2, 3,2, 4)第一个2表示最外层也就是轴0的元素有2个,每个元素的shape是(3, 2,4),依次 3表示轴1,从图中来看也就是左边的立方体有3个元素,每个元素的shape是(2,4),最后的(2,4)就是我们通常认识的二维数组,不再赘述
沿轴的操作
axis0 : 表示from up to down 竖切
axis1 :表示from left to right 横切
下面是一个示例:
先对ndarray中数组分隔和索引符号简单解释下:
, 用于分割维数或者成为轴,
: 用于维数中的元素索引,表示方法为 起始:结束:步长,只写一个,即取该维数上的所有
操作如下:
- 先构造shpe为(2,3)的ndarray
b = np.arange(6).reshape(2,3)
print(b)
b的输出:
[[0 1 2]
[3 4 5]]
- 沿轴0方向操作
print(b.sum(axis=0))
print(b[0, :] + b[1 ,:])
输出:
[3 5 7]
注意看,此时 b.sum(axis=0)) 和 b[0, :] + b[1 ,:] 效果相同
- 沿轴1的操作sum(axis = 1)
print(b.sum(axis=1))
print(b[:, 0] + b[:,1] + b[:, 2])
同样,此时b.sum(axis=1)和 b[:, 0] + b[:,1] + b[:, 2]的结果相同。
通过轴的概念和示例,不难发现,对某个轴的操作(这是指类似sum类函数),实际上是一个降维操作:
针对0轴(N,C,H,W)的在第0轴上的操作—》输出shape是(C,H,W)
针对1轴(N,C,H,W)的在第0轴上的操作—》输出shape是(N,H,W)
也就是sum(axis = i)是如下:
- axis=0,是a[0,:,:,:] + a[1,:,:,:]+…a[N-1,:,:,:]
- axis=1,是a[:,0,:,:] + a[:,1,:,:] +…a[:,C-1,:,:]
其他类似
这样的操作有什么用呢,比如在图像数据集处理的时候,N C H W依次表示图片数,通道数,高,宽
通过使用沿轴0的方向操作,可以去掉N这个维度,成为C H W,进行图像的识别处理