Python-numpy包中多維數組轉置,transpose.swapaxes的軸編號(axis)如何理解?
如題。
下文主要以三維數組為例進行解釋,基於shape/維度概念,關於維度、shape概念可參考以下文章。numpy之轉置(transpose)和軸對換 - 我的前進日誌 - 博客園
說明:以下思考方式完全是我為了便於理解軸編號尋找的一個簡便之法,如有不妥,還請指正。四維及以上數組應該也是適用的,只是很抽象,可以用簡單的例子進行驗證。
-------------------------------以下是正文
1.首先先定義一個簡單的三維數組,可以知道shape為(2,3,4),對應0,1,2編號(可以理解為shape返回元祖(2,3,4)的索引)。
In [1]: import numpy as npIn [2]: arr=np.arange(24).reshape(2,3,4)In [3]: arrOut[3]: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]]])In [4]: arr.shapeOut[4]: (2, 3, 4)
2.引入三維坐標便於理解
坐標中的(0,1,2)(藍色標的)三個維度就是shape返回元祖的索引編號,至於為什麼垂直於底面的軸編號是0,可以聯繫二維數組進行推理。
如上圖,將arr數組想像成三維空間,如長方體,0-11 12位數在長方體的頂面,12-23在長方體的底面。
- 當axis=0時,剩餘的1,2維度組成了垂直於軸0的平面,這個平面上的數組有
[0,1,2,3 4,5,6,78,9,10,11] #數組0-1[12,13,14,1516,17,18,1920,21,22,23] #數組0-2
- 當axis=1時,剩餘的0,2維度組成了垂直於軸1的平面,這個平面上的數組有
[0,1, 2, 312,13,14,15] #數組1-1[4,5,6,716,17,18,19] #數組1-2[8,9,10,1120,21,22,23] #數組1-3
- 當axis=2時,剩餘的0,1維度組成了垂直於軸2的平面,這個平面上的數組有
[0, 4,812,16,20] #數組2-1[1,5,913,17,21] #數組2-2[2, 6,1014,18,22] #數組2-3[3,7,1115,19,23] #數組2-4
3.根據以上三個維度,以下sum()函數實例就很好理解了。
A.軸編號為0時,數組0-1和數組0-2平面疊加
In [5]: np.sum(arr,axis=0)Out[5]:array([[12, 14, 16, 18], [20, 22, 24, 26], [28, 30, 32, 34]])
B.軸編號為1時,數組1-1和數組1-2和數組1-3平面疊加
In [6]: np.sum(arr,axis=1)Out[6]:array([[12, 15, 18, 21], [48, 51, 54, 57]])
C.軸編號為2時,數組2-1和數組2-2、2-3、2-4平面疊加
In [7]: np.sum(arr,axis=2)Out[7]:array([[ 6, 22, 38], [54, 70, 86]])
4.transpose()中三個軸編號的位置變化理解
transpose(a,b,c)其中a軸編號即為參考編號,垂直於a的平面即為所有平面,該平面上的數據再根據b,c相對於(0,1,2)的位置關係進行改變,下面以實例舉例說明
A.transpose(0,1,2)對應的就是arr數組原形
In [8]: arr.transpose(0,1,2)Out[8]: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.transpose(0,2,1),即以0為參考編號,數組0-1和0-2即為所求平面數組,但是2,1相對於(0,1,2)後面的軸編號進行了交換,所以數組0-1/0-2要以對角線進行.T轉置(與二維數組的轉置一樣),所以結果如下。其餘同理。
In [9]: arr.transpose(0,2,1)Out[9]: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.以transpose(2,1,0)來驗證以上操作。2為參考編號,數組2-1/2-2/2-3/2-4即為所求平面,其中(2,1,0)中1,0位置相較於(0,1,2)進行了互換,所以轉置,結果如下。
In [10]: arr.transpose(2,1,0)Out[10]: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]]])
4.swapaxes(a,b)函數中兩個軸編號理解
首先從詞義上得知swap是「交換」的意思,swapaxes(a,b)函數則應該是a,b兩個軸編號進行位置互換後數組的變化,這樣原理和以上transpose相同了,下面實例驗證
arr.swapaxes(0,1)=arr.swapaxes(1,0)=arr.transpose(1,0,2)
In [13]: arr.swapaxes(1,0)Out[13]:array([[[ 0, 1, 2, 3], [12, 13, 14, 15]], [[ 4, 5, 6, 7], [16, 17, 18, 19]], [[ 8, 9, 10, 11], [20, 21, 22, 23]]])-------------------------------------------In [14]: arr.swapaxes(0,1)Out[14]:array([[[ 0, 1, 2, 3], [12, 13, 14, 15]], [[ 4, 5, 6, 7], [16, 17, 18, 19]], [[ 8, 9, 10, 11], [20, 21, 22, 23]]])------------------------------------------------In [15]: arr.transpose(1,0,2)Out[15]:array([[[ 0, 1, 2, 3], [12, 13, 14, 15]], [[ 4, 5, 6, 7], [16, 17, 18, 19]], [[ 8, 9, 10, 11], [20, 21, 22, 23]]])
推薦閱讀:
※為什麼用 Numpy 還是慢, 你用對了嗎?
※ImagePy教程 —— 打開圖像
※python與numpy使用的一些小tips(2)
※Numpy中Meshgrid函數介紹及2種應用場景
※給深度學習入門者的Python快速教程 - numpy和Matplotlib篇