Transposing Arrays and Swapping Axes
這一部分筆記雖然少思喊,但是我在學(xué)習(xí)這部分的時(shí)候感覺有點(diǎn)難理解乖篷,于是單獨(dú)提出來作為一個(gè)獨(dú)立的筆記來記錄凉蜂。
轉(zhuǎn)置數(shù)組(交換坐標(biāo)軸):
(一)對于二維數(shù)組來說:
In [80]: arr=np.arange(15).reshape((3,5))
In [81]: arr
Out[81]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
In [82]: arr.T
Out[82]:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
這個(gè)比較好理解:
這個(gè)轉(zhuǎn)置有點(diǎn)像我們把表達(dá)矩陣進(jìn)行轉(zhuǎn)置是一樣的道理,x軸變y軸兜材,y軸變x軸理澎。理解起來也很容易。
(二)對于多維數(shù)組來說:
情況就比較的復(fù)雜:
#首先生成一個(gè)三維數(shù)組:
In [83]: arr = np.arange(16).reshape((2, 2, 4)) #這里的2,2,4你可以把這三個(gè)數(shù)分別分配為0軸曙寡,1軸糠爬,和2軸
In [84]: arr #這是原始數(shù)組的排列方式
Out[84]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
In [86]: arr.transpose((1,0,2)) #這是轉(zhuǎn)置之后的排列方式,這個(gè)轉(zhuǎn)置是將0軸和1軸的位置交換后的結(jié)果
Out[86]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
這里有些難以理解举庶,我在網(wǎng)上查看了一些文章對 arr.transpose
功能的解析执隧,很多人是畫了一個(gè)三維坐標(biāo)軸來進(jìn)行理解的,比如說這篇文章:Python numpy.transpose 詳解户侥。無奈我當(dāng)年立體幾何學(xué)的太差镀琉,空間想象能力不好,于是自己琢磨了另一種理解的方式蕊唐,比較笨拙屋摔,但是不用太費(fèi)腦細(xì)胞:
那么同樣的道理狮杨,下面這個(gè)轉(zhuǎn)置的方法就不難理解了,0軸不動(dòng)到忽,把1軸和2軸的位置互換一下:
In [87]: arr.transpose((0,2,1))
Out[87]:
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
這里可以看到橄教,數(shù)組的結(jié)構(gòu)發(fā)生了改變,是因?yàn)槊恳粋€(gè)數(shù)對應(yīng)的索引變化很大喘漏,同樣护蝶,我列出了所有數(shù)字的索引變化前后的情況:
上面的表格可以看出,之前原數(shù)組的1軸只有0和1的索引位置翩迈,但是在變化后持灰,1軸的索引數(shù)有0,1,2,3四種情況,所以這時(shí)我們的數(shù)組結(jié)構(gòu)不再是以前的結(jié)構(gòu)了:
其實(shí)這里1軸和2軸交換也可以用arr.swapaxes
功能實(shí)現(xiàn):
In [91]: arr.swapaxes(1,2)
Out[91]:
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])