Python3 numpy .T/transpose/swapaxes陣列轉置詳解
1、numpy中的陣列
(1)陣列維數
import numpy as np
arr1d = np.arange(24).reshape(24)
print('一維陣列:', arr1d)
arr2d = np.arange(24).reshape((4, 6))
print('二維陣列:\n', arr2d)
arr3d = np.arange(24).reshape(2, 3, 4)
print('三維陣列:\n', arr3d)
輸出結果:
一維陣列: [ 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] [12 13 14 15 16 17] [18 19 20 21 22 23]] 三維陣列: [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]] Process finished with exit code 0
arrange()方法產生整數0~23,並重新按指定維數分配。
(2)陣列元素索引
一維陣列arr1d可以通過下標i(0 =< i <= len(arr1d)-1)來索引,例如arr1d[6]=6,也就是說一個下標i物件陣列中的一個元素,反之亦然。
二維陣列arr2d可以通過兩個下標i(0 =< i <= 陣列行數-1)和j(0 =< j <= 陣列列數-1)來索引,例如arrd2d[2][5]=17,也就是說一對下標(i,j)對應陣列中的一個元素。
三維陣列arr3d可以通過三個下標i(0 =< i <= reshape方法中第一個引數-1)、j(0 =< j <= 陣列行數-1)和k(0 =< k <= 陣列列數-1)來索引,例如arrd3d[0][1][2]=6,也就是說下標(i,j,k)對應陣列一個元素。
類似地,n維陣列arrdnd可以通過下標(m1,m2,m3,...,mn)來索引。
我們知道,對於二維平面中的一個點(x,y),x稱為該點的橫座標或x-軸座標,y稱為該店的縱座標或y-軸座標,類似的,我們可以將下標(m1,m2,m3,...,mn)看成一個n維空間中的點,在這個空間中也有座標軸,因為有n個座標軸,用單個字母無法命名,所以我們給每個座標軸編一個號,分別稱為0-軸,1-軸,2-軸,……,n-軸。
2、numpy的.T轉置
import numpy as np arr2d = np.arange(24).reshape((4, 6)) print('二維陣列:\n', arr2d) print('二維陣列轉置後:\n',arr2d.T) arr3d = np.arange(24).reshape(2, 3, 4) print('三維陣列:\n', arr3d) print('三維陣列轉轉置後:\n',arr3d.T)
輸出結果:
二維陣列:
[[ 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 6 12 18]
[ 1 7 13 19]
[ 2 8 14 20]
[ 3 9 15 21]
[ 4 10 16 22]
[ 5 11 17 23]]
三維陣列:
[[[ 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 12]
[ 4 16]
[ 8 20]]
[[ 1 13]
[ 5 17]
[ 9 21]]
[[ 2 14]
[ 6 18]
[10 22]]
[[ 3 15]
[ 7 19]
[11 23]]]
Process finished with exit code 0
.T對二維陣列操作比較容易,只是行列轉換,三維看起來有些難度,更不要說n維陣列了,那麼.T究竟做了什麼了,其實只是將陣列下標反序,例如n維陣列arrdnd的下標(m1,m2,m3,...,mn)對應的元素,經過.T轉置後,在(mn,...,m2,m1)的位置上,例如:
arrnd=np.arange(120).reshape(1,2,3,4,5)
arrndT=arrnd.T
print('arrnd[0][1][2][3][4]=', arrnd[0][1][2][3][4])
print('arrndT[4][3][2][1][0]=', arrndT[4][3][2][1][0])
輸出結果:
arrnd[0][1][2][3][4]= 119
arrndT[4][3][2][1][0]= 119
示例中定義了一個5維陣列。
3、 numpy的transpose
首先我們來看一個三維陣列的例子:
import numpy as np
arr3d = np.arange(24).reshape(2, 3, 4)
print('三維陣列:\n', arr3d)
arr3dT=arr3d.transpose(1, 0, 2)
print('三維陣列轉轉置後:\n', arr3dT)
輸出結果:
三維陣列:
[[[ 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]
[12 13 14 15]]
[[ 4 5 6 7]
[16 17 18 19]]
[[ 8 9 10 11]
[20 21 22 23]]]
Process finished with exit code 0
transpose究竟做了什麼?首先對三維陣列的維數(2,3,4)依次編號0,1,2,稱之為0-軸,1-軸,2-軸。transpose(1,0,2)表示對換了1-軸和0-軸(本來應該是0,1,2)的位置,2-軸沒變。也就是說tranpose會將下標(i,j,k)對應的元素變換到下標(j,i,k)上。例如三維陣列元素11的原來下標位置是(0,2,3),通過transpose應該變換到(2,0,3)的位置上,變化後的陣列(2,0,3)的位置上確實是11。
3、numpy的swapaxes
swapaxes顧名思義是交換軸的意思。我們看個例子:
import numpy as np
arr3d = np.arange(24).reshape(2, 3, 4)
print('三維陣列:\n', arr3d)
arr3dT=arr3d.swapaxes(2, 1)
print('三維陣列轉轉置後:\n', arr3dT)
輸出結果:
三維陣列:
[[[ 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 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
[[12 16 20]
[13 17 21]
[14 18 22]
[15 19 23]]]
Process finished with exit code 0
swapaxes(p,q)(p和q是軸的編號)表示對換p和q軸,案例中表示對換1-軸和2-軸。