文章目錄
- 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]]