講完了數(shù)組對(duì)象的基本知識(shí),我們今天看看如何變化一個(gè)數(shù)組的結(jié)構(gòu)撵孤,也就是轉(zhuǎn)置操作迈着。
轉(zhuǎn)置,就是在數(shù)組維度不變的情況下邪码,使數(shù)組結(jié)構(gòu)發(fā)生變化的過程裕菠。
轉(zhuǎn)置可能是體、行闭专、列的數(shù)目發(fā)生變化奴潘,也可能是元素的排列順序發(fā)生變化。但一個(gè)數(shù)組的轉(zhuǎn)置影钉,其維度永遠(yuǎn)不變画髓。
轉(zhuǎn)置有點(diǎn)類似玩魔方。設(shè)想一下你也可以將魔方各種顛倒平委、行變列奈虾、列變行,也可以扭轉(zhuǎn)魔方把小塊打散廉赔。但魔方永遠(yuǎn)是一個(gè)立方體(用錘子不算)肉微。
轉(zhuǎn)置包括以下操作方法:
- np.transpose()方法:將數(shù)組的shape進(jìn)行對(duì)調(diào),有參數(shù)蜡塌。
- object.T方法(沒有括號(hào)):將行列對(duì)調(diào)浪册。
- np.swapaxes()方法:調(diào)換shape的任意兩個(gè)值,有參數(shù)岗照。
- np.rollaxis()方法:將指定的shape值滾到指定的位置村象,有參數(shù)。
np.transpose()方法:
將一個(gè)數(shù)組的維度攒至,按指定要求對(duì)調(diào)厚者。共有兩個(gè)參數(shù):
- a:指定的數(shù)組;
- axes:指定的維度順序迫吐,接收一個(gè)元組库菲,該元組像索引一樣,對(duì)應(yīng)著數(shù)組shape(c,b,a)的參數(shù)志膀。
像這樣:
import numpy as np
arr = np.arange(24).reshape((2,3,4)) # 2塊 3行 4列
print('原arr數(shù)組:\n',arr)
arr1 = np.transpose(arr, axes=(1,2,0)) # 3塊 4行 2列
print('轉(zhuǎn)置后的arr1數(shù)組:\n',arr1)
# 運(yùn)行結(jié)果:
原arr數(shù)組:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
轉(zhuǎn)置后的arr1數(shù)組:
[[[ 0 12]
[ 1 13]
[ 2 14]
[ 3 15]]
[[ 4 16]
[ 5 17]
[ 6 18]
[ 7 19]]
[[ 8 20]
[ 9 21]
[10 22]
[11 23]]]
發(fā)現(xiàn)了嗎熙宇?
既然理解了axes=(0,1,2)和shape參數(shù)(叫“軸”)呈索引對(duì)應(yīng)關(guān)系,也就懂了元素是如何被調(diào)換的溉浙。是的烫止,每個(gè)元素都有一個(gè)index坐標(biāo)系(如上例中的元素“0”是[0, 0, 0],元素“14”是[1, 0, 2])戳稽,逐一對(duì)每個(gè)元素坐標(biāo)執(zhí)行axes的調(diào)換規(guī)則就是了馆蠕。
最后說一句,transpose()方法不寫axes參數(shù),代表直接行列對(duì)倒(“軸”對(duì)倒)互躬,如(2,4)到(4,2)播赁,(2,5,3)到(3,5,2)等等。
object.T方法(沒有括號(hào)):
這個(gè)操作和transpose()方法不帶參時(shí)別無二致吼渡,不多講了容为。
swapaxes()方法:
該方法用于交換數(shù)組的任意兩個(gè)軸。共有三個(gè)參數(shù):
- a:指定的數(shù)組寺酪;
- axis1:要對(duì)調(diào)的一個(gè)軸坎背;
- axis2:要對(duì)調(diào)的另一個(gè)軸。
import numpy as np
arr = np.arange(24).reshape((2,3,4)) # 2塊 3行 4列
print('原arr數(shù)組:\n',arr)
print('原arr數(shù)組的shape:',arr.shape)
arr1 = np.swapaxes(arr, axis1=1, axis2=2) # arr的1軸(行)和2軸(列)對(duì)調(diào)房维。也可寫成(arr,2,1)是一個(gè)意思
print('對(duì)調(diào)任意兩個(gè)軸后的arr1數(shù)組:\n',arr1)
print('arr1的shape:',arr1.shape)
# 運(yùn)行結(jié)果:
原arr數(shù)組:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
原arr數(shù)組的shape: (2, 3, 4)
對(duì)調(diào)任意兩個(gè)軸后的arr1數(shù)組:
[[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
[[12 16 20]
[13 17 21]
[14 18 22]
[15 19 23]]]
arr1的shape: (2, 4, 3)
rollaxis()方法:
將指定的shape值滾到指定的位置。注意rolaxis是滾抬纸,不是調(diào)咙俩。
參數(shù)也有三個(gè):
- a:指定的數(shù)組;
- axis:指定要滾動(dòng)的軸湿故;
- start:滾到第幾位阿趁。不寫默認(rèn)start=0,即讓軸移動(dòng)到第一位坛猪。
import numpy as np
arr = np.arange(120).reshape((3,5,2,4)) # 2塊 3行 4列
arr1 = np.rollaxis(arr, axis=0, start=4) # shape()的0軸滾到第4個(gè)
arr2 = np.rollaxis(arr, axis=2, start=1) # shape()的2軸滾到第2個(gè)
arr3 = np.rollaxis(arr, axis=3, start=4) # shape()的3軸滾到第4個(gè)
arr4 = np.rollaxis(arr, axis=3, start=2) # shape()的3軸滾到第3個(gè)
arr5 = np.rollaxis(arr, axis=0, start=0) # shape()的0軸滾到第1個(gè)
print('原arr數(shù)組的shape:',arr.shape)
print('arr1的shape:',arr1.shape)
print('arr2的shape:',arr2.shape)
print('arr3的shape:',arr3.shape)
print('arr4的shape:',arr4.shape)
print('arr5的shape:',arr5.shape)
# 運(yùn)行結(jié)果:
原arr數(shù)組的shape: (3, 5, 2, 4)
arr1的shape: (5, 2, 4, 3)
arr2的shape: (3, 2, 5, 4)
arr3的shape: (3, 5, 2, 4)
arr4的shape: (3, 5, 4, 2)
arr5的shape: (3, 5, 2, 4)
以上是數(shù)組轉(zhuǎn)置的所有內(nèi)容脖阵。其實(shí)四個(gè)方法有很多共通之處,底層都是調(diào)動(dòng)軸索引到指定位置墅茉。
我們拿一個(gè)小案例命黔,用四種方法實(shí)現(xiàn)對(duì)一個(gè)二維數(shù)組的T轉(zhuǎn)置(行列互倒)。
import numpy as np
arr = np.arange(12).reshape(3, 4)
arr1 = np.transpose(a=arr, axes=(1,0)) # 將0軸和1軸重新排序
arr2 = np.swapaxes(a=arr, axis1=0, axis2=1) # 將0軸和一軸對(duì)調(diào)
arr3 = arr.T # T轉(zhuǎn)置
arr4 = np.rollaxis(a=arr, axis=1, start=0) # 將1軸提到最前面
print('arr數(shù)組的shape:', arr.shape)
print('arr1數(shù)組的shape:', arr1.shape)
print('arr2數(shù)組的shape:', arr2.shape)
print('arr3數(shù)組的shape:', arr3.shape)
print('arr4數(shù)組的shape:', arr4.shape)
# 運(yùn)行結(jié)果:
arr數(shù)組的shape: (3, 4)
arr1數(shù)組的shape: (4, 3)
arr2數(shù)組的shape: (4, 3)
arr3數(shù)組的shape: (4, 3)
arr4數(shù)組的shape: (4, 3)
“軸”就斤,是操作array對(duì)象非常重要的概念悍募。讓我們?cè)倏偨Y(jié)下何為“軸”:
軸,基于數(shù)組的shape而存在洋机。
當(dāng)shape有1個(gè)坠宴,即(a,):
此時(shí)a是0軸;代表array對(duì)象的最小元素 --- 列绷旗。當(dāng)shape為2個(gè)喜鼓,即(b,a):
此時(shí)b是0軸,代表array對(duì)象的 --- 行衔肢;
此時(shí)a是1軸庄岖,代表array對(duì)象的最小元素 --- 列。當(dāng)shape為3個(gè)角骤,即(c,b,a):
此時(shí)c是0軸顿锰,代表array對(duì)象的 --- 塊;
此時(shí)b是1軸,代表array對(duì)象的 --- 行硼控;
此時(shí)a是2軸刘陶,代表array對(duì)象的最小元素 --- 列。當(dāng)shape為4個(gè)牢撼,即(d,c,b,a):
此時(shí)d是0軸匙隔,代表array對(duì)象的 --- 大塊(土話別介意 =。=)熏版;
此時(shí)c是1軸纷责,代表array對(duì)象的 --- 小塊;
此時(shí)b是2軸撼短,代表array對(duì)象的 --- 行再膳;
此時(shí)a是3軸,代表array對(duì)象的最小元素 --- 列曲横。
有邏輯的地方在于喂柒,在shape(2,3,4)中,你可以把軸理解為shape元素的索引禾嫉,通過索引定位到shape元素灾杰,并實(shí)現(xiàn)元素間的各種對(duì)倒和互換;
而在一個(gè)可視化的數(shù)組中熙参,比如print(array)時(shí)艳吠,可以把軸理解為數(shù)組的顆粒度遞增,就像上面的shape(d,c,b,a)孽椰,0軸代表大塊昭娩,1軸代表小塊,2軸代表行黍匾,3軸代表列题禀。而shape(a,),0軸代表列膀捷,因?yàn)榱幸呀?jīng)是最小的分割單位了迈嘹。
更新一下numpy系列的學(xué)習(xí)進(jìn)度:
后面會(huì)再講一下numpy的數(shù)組拼接和分割,希望用一篇搞定全庸。而后有關(guān)數(shù)組的常規(guī)操作就講完了秀仲,到此你也對(duì)numpy的玩法有了相當(dāng)全面的掌握。再往后就是各種數(shù)學(xué)函數(shù)的調(diào)用壶笼,用來實(shí)現(xiàn)特定的計(jì)算神僵。沒有太多燒腦的部分,甚至需要時(shí)再百度也來得及覆劈。