numpy之轉置(transpose)和軸對換

轉置(transpose)和軸對換

轉置可以對數組進行重置,返回的是源數據的視圖(不會進行任何復制操作)。

轉置有三種方式,transpose方法、T屬性以及swapaxes方法。

1 .T,適用于一、二維數組

In [1]: import numpy as np

In [2]: arr = np.arange(20).reshape(4,5)#生成一個4行5列的數組

In [3]: arr
Out[3]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

In [4]: arr.T #求轉置
Out[4]:
array([[ 0,  5, 10, 15],
       [ 1,  6, 11, 16],
       [ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 4,  9, 14, 19]])

2. 高維數組

對于高維數組,transpose需要用到一個由軸編號組成的元組,才能進行轉置。

這里,著實好好理解了一下。開始的時候怎么都想不明白。因為他跟矩陣轉置理解起來不太一樣。

主要參考:
AbstractSky的博客
Albert Chen
經管之家

對多維數組來說,確定最底層的一個基本元素位置需要用到的索引個數即是維度。這句話的理解可以結合我索引和切片的那篇文章理解。

我是這樣的理解的,比如說三維的數組,那就對維度進行編號,也就是0,1,2。這樣說可能比較抽象。這里的0,1,2可以理解為對shape返回元組的索引。
比如:

In [59]: arr1 = np.arange(12).reshape(2,2,3)

In [60]: arr1
Out[60]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])

In [61]: arr1.shape #看形狀
Out[61]: (2, 2, 3) #說明這是一個2*2*3的數組(矩陣),返回的是一個元組,可以對元組進行索引,也就是0,1,2
形狀 索引
2 0
2 1
3 2

所以說,transpose參數的真正意義在于這個shape元組的索引。

那么它的轉置就應該是


In [62]: arr1.transpose((1,0,2))
Out[62]:
array([[[ 0,  1,  2],
        [ 6,  7,  8]],

       [[ 3,  4,  5],
        [ 9, 10, 11]]])

比如,數值6開始的索引是[1,0,0],變換后變成了[0,1,0]
這也說明了,transpose依賴于shape

但是,對于為什么轉置最后一個索引是不動的,頗為不解。數組或者說矩陣的這塊有點太抽象了。雖然我線代成績不錯,但是這玩意不太一樣啊。

3.swapaxes

雖然還有點不解的地方,但是,理解了上方那部分之后,swapaxes方法也就很好理解了。它接受一對軸編號。進行軸對換。其實也就是shape參數。

In [67]: arr2 = np.arange(16).reshape(2,2,4)           
                                                       
In [68]: arr2                                          
Out[68]:                                               
array([[[ 0,  1,  2,  3],                              
        [ 4,  5,  6,  7]],                             
                                                       
       [[ 8,  9, 10, 11],                              
        [12, 13, 14, 15]]])                            
                                                       
In [69]: arr2.shape                                    
Out[69]: (2, 2, 4)                                     
                                                       
In [70]: arr2.swapaxes(1,2)                            
Out[70]:                                               
array([[[ 0,  4],                                      
        [ 1,  5],                                      
        [ 2,  6],                                      
        [ 3,  7]],                                     
                                                       
       [[ 8, 12],                                      
        [ 9, 13],                                      
        [10, 14],                                      
        [11, 15]]])   

In [4]: arr2.swapaxes(1,0)#轉置,對比transpose(1,0,2)
Out[4]:
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])                                 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容