原文地址:https://www.cnblogs.com/chenyansu/p/6774963.html,
看書中看到一行代碼:
mymatrix5 = mat([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
mymatrix5.transpose()
在Numpy對矩陣的轉置中,我們可以用transpose()函數來處理。
這個函數的運行是非常反常理的,可能會令人陷入思維誤區。
假設有這樣那個一個三維數組(2*4*2):
array ([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
(1). 錯誤的觀點
我們通常的想法是
從x軸看去,0, 1 ,2 ,3
從y軸看去,0,4
從z軸看去,0, 8
這樣表達或許更清晰
y y
x: 0, 1, 2, 3 ----z---- 8, 9, 10, 11
4, 5, 6, 7 ----z----12, 13, 14, 15
下標的排列為[x, y, z]
(2). 正確的觀點
事實上,上述廟是是錯誤的,我們可以通過下標來測試:
arr[0, 0, 0]
0
arr[1, 0, 0]
8
arr[0, 1, 0]
4
arr[0, 0, 1]
1
可以看出,通過改變第一個下標, 我們實際的變動為(1)中表示的z,而不是x,arr[1, 0, 0]所得的數是8而不是1;通過改變第三個下標, 我們實際的變動為(1)中表示的x,而不是z,arr[0, 0, 1]所得的數是1而不是8.
所以,一個數的下標為[z, y, x]
(3)transpose函數的使用
首先,我們利用transpose原樣輸出
arr.transpose((0, 1, 2))
-----------結果的分割線----------
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
在這里,transpose()函數的(0, 1, 2)對應着(z, y, x)軸
當我們輸入arr.transpose((0, 2, 1))時,產生下列結果
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
我們可以看到,當我們改變了1和2的位置,x和y轉置了。
(4)總結:重點在於理解,三維數組的下標為[z, y, x], transpose()對其的默認編號為0=z, y=1, x=2.