文章目录
- axis的含义
- 旁门左道式理解
- 二维数组中的axis
- 三维数组中的axis
- 正规理解
axis的含义
在自己分析之前先摆上官方关于多维数组中axis的值的定义:
axis = 0,表示第一个维度
axis = 1,表示第二个维度
axis = -1,表示最后一个维度 【二维数组里axis=1和axis=-1等价】
以下先分析二维数组里axis=1和axis=0的区别,再分析三维数组里axis=-1,0,1的区别
PS:可以尝试先看看正规理解,如果能理解就不用看旁门左道式理解了~
旁门左道式理解
二维数组中的axis
我们先了解一下关于axis的一些知识~
axis用来为超过一维的数组定义属性。二维数据拥有两个轴:第0轴沿着行的方向垂直向下,第1轴沿着列的方向水平延申。1表示横轴,方向从左到右;0表示纵轴,方向从上到下。当axis=1时,数组的变化是横向的,体现出列的增加或者减少。反之,当axis=0时,数组的变化是纵向的,体现出行的增加或减少。
结合例子来看:
根据第二张图我们来理解axis,简单来讲,0轴沿着行的方向垂直向下竖着加,1轴沿着列的方向水平延申横着加。
三维数组中的axis
摸着良心讲二维数组中axis真的是很好理解,三维数组中axis难以理解的地方在于,三维数组的[]太多了!所以在理解的时候很容易懵。话不多说,进入正题~
先看一组例子:
a = np.array([[[0, 1, 44], [3, 4, 25], [6, 7, 88]],[[9, 50, 11], [12, 73, 14], [15, 66, 17]],[[78, 19, 20], [91, 22, 23], [84, 25, 26]]])
print("a=", a)
b = np.max(a, axis=0)
print("b=", b)
运行结果:
a= [[[ 0 1 44][ 3 4 25][ 6 7 88]][[ 9 50 11][12 73 14][15 66 17]][[78 19 20][91 22 23][84 25 26]]]
b= [[78 50 44][91 73 25][84 66 88]]
把a = np.max(b, axis=0) 改成a = np.max(b, axis=1),则运行结果如下:
a= [[[ 0 1 44][ 3 4 25][ 6 7 88]][[ 9 50 11][12 73 14][15 66 17]][[78 19 20][91 22 23][84 25 26]]]
b= [[ 6 7 88][15 73 17][91 25 26]]
把a = np.max(b, axis=0) 改成a = np.max(b, axis=-1),则运行结果如下:
a= [[[ 0 1 44][ 3 4 25][ 6 7 88]][[ 9 50 11][12 73 14][15 66 17]][[78 19 20][91 22 23][84 25 26]]]
b= [[44 25 88][50 73 66][78 91 84]]
用第一个维度、第二个维度、最后一个维度来理解axis是很抽象的,所以本文用去掉[]的方式来帮助大家理解axis
三维数组是这样表示出来的
[[[]
[]
[]]
[[]
[]
[]]
[[]
[]
[]]]
而对数组进行操作是根据[]划分的范围来决定的
axis = 0,表示去掉[]之后进行max操作
去掉之后长这样:
[[ 0 1 44][ 3 4 25][ 6 7 88]][[ 9 50 11][12 73 14][15 66 17]][[78 19 20][91 22 23][84 25 26]]
也就是把一个三维数组分成了三个二维数组,则在找出最大值时(执行max时),是将三个二维数组每个相同位置的元素进行比较,最终取三个之中最大的作为该位置的最终值。
【0,9,78中取78,1,50,19中取50…以此类推】
b= [[78 50 44][91 73 25][84 66 88]]
axis = 1,表示去掉[]之后进行max操作
去掉之后长这样:
[[ 0 1 44][ 3 4 25][ 6 7 88][ 9 50 11][12 73 14][15 66 17][78 19 20][91 22 23][84 25 26]]
也就变成了三个元素为一个“小组”的9个小组,从前三个小组里每个相同位置的元素中选出最大值作为最终结果里第一行对应位置的最终值;从中间三个小组里每个相同位置的元素中选出最大值作为最终结果里第二行对应位置的最终值;从后三个小组里每个相同位置的元素中选出最大值作为最终结果里第三行对应位置的最终值。
【以中间三组为例:9,12,15中选取15赋值到第二行第一个位置;50,73,66中选取73第二行第二个位置;11,14,17中选取17第二行第三个位置】
b= [[ 6 7 88][15 73 17][91 25 26]]
axis = -1,表示去掉[]之后进行max操作
去掉之后长这样:
[[ 0 1 443 4 256 7 88][ 9 50 1112 73 1415 66 17][78 19 2091 22 2384 25 26]]
可以看出每个元素现在已经“各自为战”了,不同于之前的各个二维数组相同位置的元素;每个小组相同位置的元素;他们只能以元素的身份和别的元素去比较。
第一行的元素比较结果作为第一行第一列的最终值,第二行的元素比较结果作为第一行第二列的最终值……第四行的元素比较结果作为第二行第一列的最终值……以此类推。
【78,19,20中取78赋值到第三行第一个位置,91,22,23中取91赋值到第三行第二个位置,84,25,26中取84赋值到第三行第三个位置】
b= [[44 25 88][50 73 66][78 91 84]]
正规理解
其实用维度理解挺好理解的
如果用x,y,z表示三维数组的三个维度
axis = 0时,确定最终二维数组的yi,zi时,也就是(x0,yi,zi)、(x1,yi,zi)、(x2,yi,zi)三个点的值作比较,取最大的放到(yi,zi)。
【确定(y1,z1)时,比较(x0,y1,z1)=4、(x1,y1,z1)=73、(x2,y1,z1)=22】
a= [[[ 0 1 44][ 3 4 25][ 6 7 88]][[ 9 50 11][12 73 14][15 66 17]][[78 19 20][91 22 23][84 25 26]]]
b= [[78 50 44][91 73 25][84 66 88]]
axis = 1时,确定最终二维数组的xi,zi时,也就是(xi,y0,zi)、(xi,y1,zi)、(xi,y2,zi)三个点的值作比较,取最大的放到(xi,zi)。
【确定(x1,z1)时,比较(x1,y0,z1)=50、(x1,y1,z1)=73、(x1,y2,z1)=66】
a= [[[ 0 1 44][ 3 4 25][ 6 7 88]][[ 9 50 11][12 73 14][15 66 17]][[78 19 20][91 22 23][84 25 26]]]
b= [[ 6 7 88][15 73 17][91 25 26]]
axis = -1时,确定最终二维数组的xi,yi时,也就是(xi,yi,z0)、(xi,yi,z1)、(xi,yi,z2)三个点的值作比较,取最大的放到(xi,yi)。
【确定(x1,y1)时,比较(x1,y1,z0)=12、(x1,y1,z1)=73、(x1,y1,z2)=14】
a= [[[ 0 1 44][ 3 4 25][ 6 7 88]][[ 9 50 11][12 73 14][15 66 17]][[78 19 20][91 22 23][84 25 26]]]
b= [[44 25 88][50 73 66][78 91 84]]