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)