二維數組的轉置應該都知道,就是行列交換
而在numpy中也可以對三維數組進行轉置,np.T 默認進行的操作是將0軸與2軸交換
本文主要對三位數組軸交換的理解上發表本人的看法。
a = np.array(range(24)) Out[101]: 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]) b = a.reshape(2,3,4) b Out[103]: 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]]])
在三位數組中我們稱三個軸分別為行,列,面
在數組b中,
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],是一行
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]是一行
展開寫[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]看的更清楚。這是行的概念
[ 0, 1, 2, 3],是一列 [ 4, 5, 6, 7],是一列 [ 8, 9, 10, 11]是一列
而其中[0,4,8] [1,5,9] [2,6,10] [3,7,11]分別是一個面
回過頭來可以發現,b是由2行3列4面組成的三維數組 (行代表0軸,列1軸,面2軸)
接下來記住一句話,交換哪兩個軸,要保持另一個軸不改變,示例如下
取c為b的列和面交換后的數組
c = b.swapaxes(1,2) c Out[105]: array([[[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]], [[12, 16, 20], [13, 17, 21], [14, 18, 22], [15, 19, 23]]])
回想那句話,交換哪兩個軸,另一個軸不變,可以發現c還是兩行,而且交換只是在每一行中發生變化
原來的列變成了面,原來的面變成了列
看第二種,d表示b的0軸和2軸的交換
d = b.swapaxes(0,2) d Out[108]: array([[[ 0, 12], [ 4, 16], [ 8, 20]], [[ 1, 13], [ 5, 17], [ 9, 21]], [[ 2, 14], [ 6, 18], [10, 22]], [[ 3, 15], [ 7, 19], [11, 23]]])
看上去有點蒙逼了,但還是想一下那句話,交換了0軸和2軸,那么1軸是不變的。
我們把原來的b看成是以行和面為元素的二維數組
即b是兩行,四面。每個面用第一個元素代替 即[0,4,8] 用[0]來代替
即b可以寫成[[0],[1],[2],[3]
[12],[13],[14],[15]]
然后進行交換軸 其實也就變成了二維數組的轉置
變換后為[0],[12]
[1],[13]
[2],[14]
[3],[15]
最后我們再把每個面展開,就得到結果了。到現在你有沒有法線,面中的元素個數與列的大小是一樣的。
好了,接下來你可以試試將0軸與1軸交換。一步一步來,歡迎評論區討論。