写在前面
因为对axis的不太了解,给阅读各种代码时带来了各种困扰,因此下定决心决定解决此问题。
根据定义,维度的轴号是数组形状中该维度的索引。 它也是在索引时用于访问该维度的位置。
axis
的值是按shape
来的,shape=(2,2)
时,axis
的值有0,1
,shape=(3,3,3)
时,axis
的值有0,1,2
,
二维
假设有一个二维数组[[1,2],[3,4]]
In [1]: import numpy as np
#先上一个二维数组
In [3]: x=np.array([[1,2],[3,4]])
In [4]: x
Out[4]:
array([[1, 2],
[3, 4]])
In [5]: x.shape
Out[5]: (2, 2)
#可以想象成把数组向下压缩(沿着列的方向),取元素之和,4=1+3,6=2+4
In [6]: x.sum(axis=0)
Out[6]: array([4, 6])
#可以想象成把数组向右压缩(沿着行的方向),取元素之和,3=1+2,7=3+4
In [7]: x.sum(axis=1)
Out[7]: array([3, 7])
三维
假设有一个三维数组
In [8]: y=np.array([[[ 0, 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]]])
In [9]: print y
[[[ 0 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]]]
#沿着axis=0,求和
In [10]: y.sum(axis=0)
Out[10]:
array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]])
嗯,图很丑,将就一下,不知道要用什么绘图软件
y.sum(axis=0)
就相当于把一个3*3*3的立方体向着蓝色的面压缩,变成一个3*3的数组,对应位置的元素求和,再按顺序排列。
#同理,axis=1相当于向着红色的面压缩,变成一个3*3的数组,对应位置的元素求和,再按顺序排列。
In [11]: y.sum(axis=1)
Out[11]:
array([[ 9, 12, 15],
[36, 39, 42],
[63, 66, 69]])
#同理,axis=2相当于向着黄色的面压缩,变成一个3*3的数组,对应位置的元素求和,再按顺序排列。
In [12]: y.sum(axis=2)
Out[12]:
array([[ 3, 12, 21],
[30, 39, 48],
[57, 66, 75]])
接下来就是四维了
偷个小懒,来个最简单的吧
In [10]: x=np.array([
...: [
...: [[1,2],
...: [3,4]]
...: ],
...: [
...: [[5,6],
...: [7,8]]
...: ]
...:
...: ])
In [11]: x
Out[11]:
array([[[[1, 2],
[3, 4]]],
[[[5, 6],
[7, 8]]]])
In [12]: x.shape
Out[12]: (2, 1, 2, 2)
怎么理解呢,画出四维,臣妾实在是做不到呀^ _ ^,粗暴一点理解为两个三维的杂交,交。。也就是两个1*2*2的立方体叠加吧,再上一张丑图:
In [13]: x.sum(0)
Out[13]:
array([[[ 6, 8],
[10, 12]]])
#压缩后是三维哦,axis=0时对应的是shape[0]
In [14]: x.sum(0).shape
Out[14]: (1, 2, 2)
#之后又可以看做是退化了,每一个二维的数组对应一个立方体的操作
In [15]: x.sum(1) #向着蓝面(channel方向),shape[1]
Out[15]:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
In [16]: x.sum(2) #向着红面(column方向),shape[2]
Out[16]:
array([[[ 4, 6]],
[[12, 14]]])
In [17]: x.sum(3) #向着黄面方向(row方向),shape[3]
Out[17]:
array([[[ 3, 7]],
[[11, 15]]])
四维的axis=0
好像还是有点烧脑,就相当于在保持立方体的形状时,各个立方体超时空融合吧,具体的就脑补吧。
#再来一个例子吧,2个2*1*1的立方体
In [25]: y=np.array([
...: [[[1]],[[2]]],
...: [[[3]],[[4]]]
...: ])
In [26]: y.shape
Out[26]: (2, 2, 1, 1)
In [27]: y.sum(0)
Out[27]:
array([[[4]],
[[6]]])
最后吐槽一下自己的丑图,愿推荐一个好用的绘图软件