轉(zhuǎn)置(transpose)和軸對換
轉(zhuǎn)置可以對數(shù)組進(jìn)行重置驹暑,返回的是源數(shù)據(jù)的視圖(不會進(jìn)行任何復(fù)制操作)。
轉(zhuǎn)置有三種方式遵蚜,
transpose
方法呼盆、T
屬性以及swapaxes
方法。
1 .T,適用于一盾剩、二維數(shù)組
In [1]: import numpy as np
In [2]: arr = np.arange(20).reshape(4,5)#生成一個4行5列的數(shù)組
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 #求轉(zhuǎn)置
Out[4]:
array([[ 0, 5, 10, 15],
[ 1, 6, 11, 16],
[ 2, 7, 12, 17],
[ 3, 8, 13, 18],
[ 4, 9, 14, 19]])
2. 高維數(shù)組
對于高維數(shù)組雷激,transpose需要用到一個由軸編號組成的元組,才能進(jìn)行轉(zhuǎn)置告私。
這里屎暇,著實好好理解了一下。開始的時候怎么都想不明白驻粟。因為他跟矩陣轉(zhuǎn)置理解起來不太一樣根悼。
主要參考:
AbstractSky的博客
Albert Chen
經(jīng)管之家
對多維數(shù)組來說,確定最底層的一個基本元素位置需要用到的索引個數(shù)即是維度蜀撑。這句話的理解可以結(jié)合我索引和切片的那篇文章理解番挺。
我是這樣的理解的,比如說三維的數(shù)組屯掖,那就對維度進(jìn)行編號玄柏,也就是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的數(shù)組(矩陣),返回的是一個元組绍坝,可以對元組進(jìn)行索引徘意,也就是0,1,2
形狀 | 索引 |
---|---|
2 | 0 |
2 | 1 |
3 | 2 |
所以說,transpose
參數(shù)的真正意義在于這個shape
元組的索引轩褐。
那么它的轉(zhuǎn)置就應(yīng)該是
In [62]: arr1.transpose((1,0,2))
Out[62]:
array([[[ 0, 1, 2],
[ 6, 7, 8]],
[[ 3, 4, 5],
[ 9, 10, 11]]])
比如椎咧,數(shù)值6開始的索引是[1,0,0]
,變換后變成了[0,1,0]
把介。
這也說明了勤讽,transpose
依賴于shape
。
但是拗踢,對于為什么轉(zhuǎn)置最后一個索引是不動的脚牍,頗為不解。數(shù)組或者說矩陣的這塊有點太抽象了巢墅。雖然我線代成績不錯诸狭,但是這玩意不太一樣啊券膀。
3.swapaxes
雖然還有點不解的地方,但是驯遇,理解了上方那部分之后芹彬,swapaxes
方法也就很好理解了。它接受一對軸編號叉庐。進(jìn)行軸對換雀监。其實也就是shape
參數(shù)。
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)#轉(zhuǎn)置眨唬,對比transpose(1,0,2)
Out[4]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])