Numpy三維數組的轉置與交換軸


二維數組的轉置應該都知道,就是行列交換

而在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軸交換。一步一步來,歡迎評論區討論。
      



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM