1. 程式人生 > >Python3 numpy .T/transpose/swapaxes陣列轉置詳解

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-軸。