【BUG】numpy.transpose對三維數組的轉置

import numpy as np

三維數組

 

arr1 = np.arange(16).reshape((2, 2, 4))
#[[[ 0  1  2  3]
#  [ 4  5  6  7]]

#  [[ 8  9 10 11]
#  [12 13 14 15]]]

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

正序爲(0,1,2),數組爲

 

 

#[[[ 0  1  2  3]
#  [ 4  5  6  7]]

#  [[ 8  9 10 11]
#  [12 13 14 15]]]

 

 

 

爲什麼進過tanspose(1,0,2),數組變爲

 

#[[[ 0  1  2  3]
#  [ 8  9 10 11]]
#
# [[ 4  5  6  7]
#  [12 13 14 15]]]

仔細觀察之後,可以看到轉置後的數組和轉置前的數組的區別就是第一頁的第二行和第二頁的第一行對換了,可是爲什麼?

 

當我用arr1[0,1,0],索引值爲4

當我用arr2[1,0,0],索引值爲4

 

對比索引參數表的變化和正序和轉置序的不同似乎存在某種聯繫

 


對於arr1數組,索引參數表[0,0,x]可以表示第一頁的第一行,當前兩個參數對換之後,同一個元素的索引參數表並沒有變化

故arr2的第一頁第一行和arr1的第一頁第一行相同

 

對於arr1數組,索引參數表[0,1,x]可以表示第一頁第二行,當前兩個參數對換之後,同一個元素的索引值比如[0,1,0]變爲[1,0,0],

這就是解釋了索引值4的索引參數表的不同

 

大概就是這個思路所以transpose(1,0,2),數組的第一頁第二行和第二頁第一行對換

後面的四種轉置方式也大致是這個思路,仔細觀察一下,理解起來應該不難

arr3=arr1.transpose((0,2,1))

# [[[ 0  4]
#  [ 1  5]
#  [ 2  6]
#  [ 3  7]]
#
#  [[ 8 12]
#  [ 9 13]
#  [10 14]
#  [11 15]]]

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

這裏要注意的是,arr4數組變成4頁,這是因爲頁碼和行碼對換之後,

 

頁碼從數量2,變成了4

而行碼從數量4,變成了2

 

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

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


另外,轉置(2,0,1)可以看成,先轉置(0,2,1)再轉置(1,0,2)

 

轉置(2,1,0)可以看成,先轉置(1,0,2),然後轉置(0,2,1),最後轉置(1,0,2)

轉置(1,2,0)可以看成,先轉置(1,0,2),在轉置(0,2,1)

代碼可以寫成

 

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

 


 

結果一樣
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章