numpy的高緯數組轉置方法transpose()

一維數組的轉置仍是自己,不區分行向量與列向量:numpy.T

二維數組的轉置與線代的矩陣轉置理解方法相同:numpy.T

高緯數組的轉置,需用到numpy的方法:transpose()

高緯數組的轉置較難理解,以下是我的理解,特此記錄。

1.構造一個高緯數組(2*2*4的3維數組),如下:

#inimport numpy as nparr = np.arange(16).reshape(2,2,4) #reshape一個2*2*4的三維數組print(arr)#out[[[ 0 1 2 3] [ 4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]]]

對於上面的這個三維數組,如果我們想要取到8這個數,我們需要按索引[1,0,0]來找,即arr[1,0,0]=8。

2.建立shape和index的概念

(1)shape :返回的是一個tuple(元組),上述attr.shpe 的結果是(2,2,4)

對於上述(2,2,4)的三維矩陣:

第一維包含2個元素,元素是二維數組

第二維包含2個元素,元素是兩個一維數組/行向量

第三維包含4個元素,元素是具體的數字(這是我們的焦點)

(2)index:tuple是一個有序列表,我們需要按照索引來訪問其中的每個元素。

上述arr的shape是(2,2,4),對於(2,2,4)這個tuple,我們需要按照索引來訪問,2、2、4對應的索引分別是0、1、2

注意:不要混淆了arr中每個元素的索引(「1」中的arr[1,0,0]=8)和這裡shape的索引,下面會用到。

3.高緯矩陣的轉置,transpose()方法

注意:這裡的轉置不要拿線代的轉置來想像,這裡的轉置就是底層數字位置的變換,變換的規則遵循transpose()方法的規則。

#inprint(arr.transpose((1,0,2)))#out[[[ 0 1 2 3] [ 8 9 10 11]] [[ 4 5 6 7] [12 13 14 15]]]

對比一下運用transpose()前後矩陣的變換

#前[[[ 0 1 2 3] [ 4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]]]#後[[[ 0 1 2 3] [ 8 9 10 11]] [[ 4 5 6 7] [12 13 14 15]]]變化:[ 4 5 6 7][ 8 9 10 11]換了位置

變換原理:

arr.transpose((1,0,2)運行前後,矩陣的shape並沒有變,仍然是(2,2,4),改變的是index,具體如下:

(2,2,4)的索引本身是(0,1,2),通過transpose()將(0,1,2)改成了(1,0,2),也就是改變了索引的次序,第一個位置和第二個位置的索引值調換順序,0和1換了位置。從而,就改變了attr這個矩陣中所有數字索引的次序,將每個數字的索引的第一個位置和第二個位置的索引值調換位置。

改變前,8的索引是[1,0,0],執行arr.transpose((1,0,2)之後,8的索引是[0,1,0],也就是轉換之後,attr[0,1,0]=8

同理:

4.transpose()之後,矩陣的shape一定不變嗎?當然不是!

#inprint(arr.transpose(2,0,1))#out[[[ 0 4] [ 8 12]] [[ 1 5] [ 9 13]] [[ 2 6] [10 14]] [[ 3 7] [11 15]]]

transpose(2,0,1)使得(2,2,4)的矩陣改成了(4,2,2)的矩陣

「3」中的矩陣shape沒有變的原因,知道了吧。


推薦閱讀:

Eigen: C++開源矩陣計算工具
大白話講數據結構:矩陣的轉置和矩陣的乘法問題(2) (應該都能看懂的!)
tensorflow實現非負矩陣分解(Non-negative matrix factorization)

TAG:機器學習 | 數據挖掘 | 矩陣運算 |