Numpy transpose函數的可視化理解

轉自知乎觀海雲遠的文章,做了部分的刪改。

3維數組的小例子:

import numpy as np
t = np.arange(1,17).reshape(2, 2, 4)
print(t)

三維數組爲:

[[[ 1  2  3  4]
  [ 5  6  7  8]]

 [[ 9 10 11 12]
  [13 14 15 16]]]

使用轉置函數:

t1 = t.transpose(1, 0, 2)
print(t1)

轉置結果爲:

[[[ 1  2  3  4]
  [ 9 10 11 12]]

 [[ 5  6  7  8]
  [13 14 15 16]]]

上述結果初看較難直觀理解。下文采用圖示的方法對該函數進行解釋。

 

高維數組在座標系下的位置

三個維度(2, 2, 4)的index分別爲0, 1, 2,即(2(第0維), 2(第1維), 4(第2維))。 如果建立如下座標系:

圖1 標準座標系

在該座標系內可視化三維數組t:

圖2 標準座標系下的三維數組t

 

在0軸上,[[1,2,3,4],[5,6,7,8]]下標爲0,而[[9,10,11,12],[13,14,15,16]]的下標爲1,所以兩個子矩陣在0軸按先後順序排列,綠色矩陣在0軸座標0處,藍色矩陣在0軸座標1處。

在1軸上,[1,2,3,4]下標爲0,[5,6,7,8]下標爲1;[9,10,11,12]下標爲0,[13,14,15,16]下標爲1

在2軸上,1的下標爲0,2的下標爲1並依次類推,同樣5的下標爲0,6的下標爲1,並依次類推,9,10,11,12與13,14,15,16也是類似。

座標軸交換

語句t1 = t.transpose(1, 0, 2)相當於把0軸1軸位置進行了交換,2軸位置沒有變化。

對比一下:t: (0, 1, 2) → t1: (1, 0, 2)。調整方向後的座標系如下圖所示(注意0軸、1軸的位置):

圖3 交換0軸、1軸後的新座標系

 

在新座標系方向下,數組t的位置擺放可視化結果爲:

圖4中數組t仍按(2, 2, 4)對應(0軸, 1軸, 2軸)的方向擺放。

直觀對比一下數組t在原座標系和新座標系下的視覺變化。

關鍵的一步:將數組在新座標系下的擺放,原封不動地挪到原座標系下,即得到了座標軸變換後的新數組。

可以看出,在原座標系下新擺放的數組爲:

[[[ 1  2  3  4]
  [ 9 10 11 12]]

 [[ 5  6  7  8]
  [13 14 15 16]]]

進一步地,考慮3個軸都發生變化的情況:

t2 = t.transpose(2, 0, 1)

新舊座標系對比:t: (0, 1, 2) → t1: (2, 0, 1).

圖7 新舊座標系對比

數組t在新座標軸下的擺放:

前後擺放對比如圖9:

圖9 

 

將新的擺放位置放至原座標系下的可視化結果:

 

運行驗證一下:

t2 = t.transpose(2, 0, 1)
print(t2)

結果爲:

[[[ 1  5]
  [ 9 13]]

 [[ 2  6]
  [10 14]]

 [[ 3  7]
  [11 15]]

 [[ 4  8]
  [12 16]]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章