Numpy中轉置transpose、T和swapaxes

利用Python進行數據分析時,Numpy是最常用的庫,經常用來對數組、矩陣等進行轉置等,有時候用來做數據的存儲。

在numpy中,轉置transpose和軸對換是很基本的操作,下面分別詳細講述一下,以免自己忘記。

In [1]: import numpy as np

In [2]: arr=np.arange(16).reshape(2,2,4)

In [3]: arr
Out[3]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
如上圖所示,將0-15放在一個2 2 4 的矩陣當中,得到結果如上。

現在要進行裝置transpose操作,比如

In [4]: arr.transpose(1,0,2)
Out[4]:
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])
結果是如何得到的呢?

每一個元素都分析一下,0位置在[0,0,0],轉置爲[1,0,2],相當於把原來位置在[0,1,2]的轉置到[1,0,2],對0來說,位置轉置後爲[0,0,0],同理,對1 [0,0,1]來說,轉置後爲[0,0,1],同理我們寫出所有如下:

其中第一列是值,第二列是轉置前位置,第三列是轉置後,看到轉置後位置,再看如上的結果,是不是就豁然開朗了?

0  [0,0,0] [0,0,0]
1  [0,0,1] [0,0,1]
2  [0,0,2] [0,0,2]
3  [0,0,3] [0,0,3]
4  [0,1,0] [1,0,0]
5  [0,1,1] [1,0,1]
6  [0,1,2] [1,0,2]
7  [0,1,3] [1,0,3]
8  [1,0,0] [0,1,0]
9  [1,0,1] [0,1,1]
10 [1,0,2] [0,1,2]
11 [1,0,3] [0,1,3]
12 [1,1,0] [1,1,0]
13 [1,1,1] [1,1,1]
14 [1,1,2] [1,1,2]
15 [1,1,3] [1,1,3]
再看另一個結果:

In [20]: arr.T
Out[20]:
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

In [21]: arr.transpose(2,1,0)
Out[21]:
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])
再對比轉置前後的圖看一下:

0  [0,0,0] [0,0,0]
1  [0,0,1] [1,0,0]
2  [0,0,2] [2,0,0]
3  [0,0,3] [3,0,0]
4  [0,1,0] [0,1,0]
5  [0,1,1] [1,1,0]
6  [0,1,2] [2,1,0]
7  [0,1,3] [3,1,0]
8  [1,0,0] [0,0,1]
9  [1,0,1] [1,0,1]
10 [1,0,2] [2,0,1]
11 [1,0,3] [3,0,1]
12 [1,1,0] [0,1,1]
13 [1,1,1] [1,1,1]
14 [1,1,2] [2,1,1]
15 [1,1,3] [3,1,1]
瞬間就明白轉置了吧!其實只要動手寫寫,都很容易明白的。另外T其實就是把順序全部顛倒過來,如下:

In [22]: arr3=np.arange(16).reshape(2,2,2,2)

In [23]: arr3
Out[23]:
array([[[[ 0,  1],
         [ 2,  3]],

        [[ 4,  5],
         [ 6,  7]]],


       [[[ 8,  9],
         [10, 11]],

        [[12, 13],
         [14, 15]]]])

In [24]: arr3.T
Out[24]:
array([[[[ 0,  8],
         [ 4, 12]],

        [[ 2, 10],
         [ 6, 14]]],


       [[[ 1,  9],
         [ 5, 13]],

        [[ 3, 11],
         [ 7, 15]]]])

In [25]: arr3.transpose(3,2,1,0)
Out[25]:
array([[[[ 0,  8],
         [ 4, 12]],

        [[ 2, 10],
         [ 6, 14]]],


       [[[ 1,  9],
         [ 5, 13]],

        [[ 3, 11],
         [ 7, 15]]]])

轉置就是這樣子,具體上面aar3轉置前後的位置,就不寫了。

下面說說swapaxes,軸對稱。

話不多,上結果

In [27]: arr.swapaxes(1,2)
Out[27]:
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])

In [28]: arr.transpose(0,2,1)
Out[28]:
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])
發現了吧,其實swapaxes其實就是把矩陣中某兩個軸對換一下,不信再看一個:

In [29]: arr3
Out[29]:
array([[[[ 0,  1],
         [ 2,  3]],

        [[ 4,  5],
         [ 6,  7]]],


       [[[ 8,  9],
         [10, 11]],

        [[12, 13],
         [14, 15]]]])

In [30]: arr3.swapaxes(1,3)
Out[30]:
array([[[[ 0,  4],
         [ 2,  6]],

        [[ 1,  5],
         [ 3,  7]]],


       [[[ 8, 12],
         [10, 14]],

        [[ 9, 13],
         [11, 15]]]])

In [31]: arr3.transpose(0,3,2,1)
Out[31]:
array([[[[ 0,  4],
         [ 2,  6]],

        [[ 1,  5],
         [ 3,  7]]],


       [[[ 8, 12],
         [10, 14]],

        [[ 9, 13],
         [11, 15]]]])
哈哈,只要動手做做,會發現其實沒有那麼困難,不能只看

紙上得來終覺淺,絕知此事要躬行!共勉







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