Numpy數(shù)組的組合與分割實(shí)現(xiàn)的方法
在介紹數(shù)組的組合和分割前,我們需要先了解數(shù)組的維(ndim)和軸(axis)概念。
如果數(shù)組的元素是數(shù)組,即數(shù)組嵌套數(shù)組,我們就稱(chēng)其為多維數(shù)組。幾層嵌套就稱(chēng)幾維。比如形狀為(a,b)的二維數(shù)組就可以看作兩個(gè)一維數(shù)組,第一個(gè)一維數(shù)組包含a個(gè)一維數(shù)組,第二個(gè)一維數(shù)組包含b個(gè)數(shù)據(jù)。
每一個(gè)一維線性數(shù)組稱(chēng)為一個(gè)軸。二維數(shù)組的第一個(gè)軸(axis=0)就是以數(shù)組為元素的數(shù)組,第二個(gè)軸(axis=1)就是數(shù)組中的數(shù)組。因此第一個(gè)軸的方向就是沿著行的方向(垂直方向),第二個(gè)軸的方向沿著列的方向(水平方向)。
我們從嵌套數(shù)組的角度來(lái)看,a[0],a[1],a[2],a[3]……分別是取二維數(shù)組的第一行,二行,三行,四行……這正是先沿著第一個(gè)軸取元素(元素為行)。a[0][0],a[0][1]……則是(沿著第二個(gè)軸)取第一行的第一個(gè)元素,第二個(gè)元素……
也就是說(shuō),數(shù)組的軸從最外層數(shù)起。
三維數(shù)組我們應(yīng)該怎么理解呢?我們可以把它看作二維數(shù)組的堆疊,即一個(gè)立方體。它的第一個(gè)軸(axis=0)就是以二維數(shù)組為元素的數(shù)組,它的方向沿著二維數(shù)組堆疊的方向,也就是立方體的高。第二個(gè)軸自然就是立方體的寬,第三個(gè)軸就是立方體的長(zhǎng)。舉例來(lái)說(shuō),一個(gè)形狀為(a,b,c)的三維數(shù)組就是a個(gè)形狀為(b,c)的二維數(shù)組嵌套在一起。
a=np.arange(24).reshape(2,3,4)#建立一個(gè)維度為3,形狀為(2,3,4)的三維數(shù)組 print(a)#打印 print(a.sum(axis=0))#沿第一個(gè)軸求和 print(a.sum(axis=1))#沿第二個(gè)軸求和 print(a.sum(axis=2))#沿第三個(gè)軸求和 ''' a的形狀如下: [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]] 沿第一個(gè)軸求和: [[12 14 16 18] [20 22 24 26] [28 30 32 34]] 沿第二個(gè)軸求和: [[12 15 18 21] [48 51 54 57]] 沿第三個(gè)軸求和: [[ 6 22 38] [54 70 86]] '''
從這個(gè)例子可以看出,沿第一個(gè)軸求和,就是從上方把這個(gè)立方體“壓扁”,第二個(gè)軸就是沿著寬,第三個(gè)軸就是沿著長(zhǎng)。類(lèi)似投影。
我們終于明白了,reshape函數(shù)的參數(shù)順序不是我們想當(dāng)然認(rèn)為的長(zhǎng),寬;長(zhǎng),寬,高;因?yàn)槟銦o(wú)法解釋為什么三維數(shù)組變形后的形狀與你所想的大相徑庭。它的順序是軸的順序(第一條軸,第二條軸,第三條軸……),也就是沿這條軸有多少個(gè)元素。軸的概念很重要,在很多函數(shù)中都有體現(xiàn)。
再直觀一點(diǎn)說(shuō),參數(shù)順序應(yīng)該是高,寬(行方向),長(zhǎng)(列方向)。
所以,數(shù)組的維度就很好理解了,就是軸的數(shù)量。我們?cè)诶斫舛嗑S數(shù)組的時(shí)候,不要先入為主地認(rèn)為多維數(shù)組的元素會(huì)更多;多維數(shù)組只是它嵌套的層數(shù)多而已。高維數(shù)組也可能不含元素。
接下來(lái)我們介紹數(shù)組的組合。
數(shù)組的組合
數(shù)組的組合有水平組合,垂直組合,深度組合等方式。實(shí)現(xiàn)這些組合的函數(shù)主要有vstack,dstack,hstack,column_stack,row_stack,concatenate等。
因?yàn)槲覀冏畛S玫臄?shù)組也不過(guò)三維,所以用水平,垂直這樣的字眼比較形象;但我們要明白,本質(zhì)上是沿軸進(jìn)行的操作。
數(shù)組組合通常不會(huì)改變數(shù)組的維度。
1.水平組合
hstack函數(shù)與concatenate函數(shù)
1.1hstack函數(shù):水平連接多個(gè)數(shù)組。參數(shù)只有一個(gè):以數(shù)組為元素的序列。
1.2concatenate函數(shù):沿著現(xiàn)有的軸連接數(shù)組序列。
函數(shù)格式:concatenate((a1, a2, ...), axis=0, out=None)
參數(shù)說(shuō)明:a1, a2, ...:為以數(shù)組為元素的類(lèi)數(shù)組序列。其中數(shù)組形狀必須相同。
axis=0:數(shù)組將沿著這個(gè)軸組合,如果坐標(biāo)軸為None,數(shù)組在使用前被平鋪。int型數(shù)據(jù),可選參數(shù),默認(rèn)為零。
2.垂直組合
vstack函數(shù)與concatenate函數(shù)
2.1vstack函數(shù):垂直連接多個(gè)數(shù)組。參數(shù)如上。
2.2concatenate函數(shù):改一下軸參數(shù)就好。
水平組合和垂直組合是比較直觀的說(shuō)法,因?yàn)槲覀冇玫淖疃嗟臄?shù)組就是一維和二維;實(shí)際上,它們分別是沿著第二條軸(水平),第一條軸(垂直)進(jìn)行組合。
a=np.array([1]) a=a.reshape(1,1,1,1,1)#只有一個(gè)元素的五維數(shù)組 b=np.array([1]) b=b.reshape(1,1,1,1,1)#與a完全相同 c=np.hstack((a,b))#水平組合 d=np.vstack((a,b))#垂直組合 print(c) print(d) print(c.shape) print(d.shape) ''' 水平組合 [[[[[1]]] [[[1]]]]] 垂直組合 [[[[[1]]]] [[[[1]]]]] c的形狀 (1, 2, 1, 1, 1) d的形狀 (2, 1, 1, 1, 1) '''
3.行組合和列組合
3.1row_stack函數(shù):行組合
將一維數(shù)組按行方向組合起來(lái),對(duì)于二維數(shù)組完全等同于vstack。對(duì)于多維數(shù)組,實(shí)際上就是沿第一個(gè)軸進(jìn)行組合。
3.2colum_stack函數(shù):列組合
將一維數(shù)組按列方向組合起來(lái),對(duì)于二維數(shù)組完全等同于hstack。對(duì)于多維數(shù)組,實(shí)際上就是沿第二個(gè)軸進(jìn)行組合。
a=np.array([0,1,2]) b=np.array([1,2,3]) c=np.row_stack((a,b)) d=np.column_stack((a,b)) print(c) print(d) ''' 行組合 [[0 1 2] [1 2 3]] 列組合 [[0 1] [1 2] [2 3]] ''' a=np.array([0,1,2]).reshape(1,1,1,1,3) b=np.array([1,2,3]).reshape(1,1,1,1,3) c=np.row_stack((a,b)) d=np.column_stack((a,b)) print(c) print(d) print(c.shape) print(d.shape) ''' 行組合 [[[[[0 1 2]]]] [[[[1 2 3]]]]] [[[[[0 1 2]]] 列組合 [[[1 2 3]]]]] c形狀 (2, 1, 1, 1, 3) d形狀 (1, 2, 1, 1, 3) '''
4.深度組合
沿著第三個(gè)軸進(jìn)行組合。
a=np.array([0,1,2]) b=np.array([1,2,3]) c=np.dstack((a,b))#深度組合 print(c) print(a.shape) print(c.shape) ''' [[[0 1] [1 2] [2 3]]] (3,) (1, 3, 2) ''' a=np.array([0,1,2]).reshape(1,1,1,3) b=np.array([1,2,3]).reshape(1,1,1,3) c=np.dstack((a,b)) print(c.shape) ''' (1, 1, 2, 3) '''
當(dāng)數(shù)組維度比較小的時(shí)候,比如一維和二維,如果組合時(shí)沒(méi)有第二和第三參數(shù),函數(shù)會(huì)自動(dòng)為其在形狀左側(cè)補(bǔ)1,也就是拓展一層。這和之前說(shuō)過(guò)的廣播機(jī)制十分類(lèi)似。
數(shù)組的分割
數(shù)組可以進(jìn)行水平,垂直等方式進(jìn)行分割。相關(guān)函數(shù):hsplit,vsplit,dsplit,split。
我們可以將數(shù)組分割成相同大?。ㄐ螤睿┑淖訑?shù)組,也可以指定分割的位置。
1.水平分割
hsplit函數(shù)和split函數(shù)。
沿水平方向,就是沿列方向,沿第二條軸(axis=1)方向。
1.1hsplit函數(shù)
格式:hsplit(ary, indices_or_sections)
第一個(gè)參數(shù)是數(shù)組;第二個(gè)參數(shù)是一個(gè)整數(shù)或列表,如果不指定,就會(huì)分割成相同大小的子數(shù)組。
a=np.arange(16).reshape(4,4) pp.pprint(a) pp.pprint(np.hsplit(a,2))#平均分割成兩部分 pp.pprint(np.hsplit(a,[2,3]))#沿第二,三列,分割成三部分 ''' array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) 分割成兩部分 [array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])] 分割成三部分 [array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2], [ 6], [10], [14]]), array([[ 3], [ 7], [11], [15]])] '''
1.2split函數(shù)
函數(shù)格式:split(ary, indices_or_sections, axis=0)
第一個(gè)參數(shù):數(shù)組。
第二個(gè)參數(shù):整數(shù)或列表,可選參數(shù)。
第三個(gè)參數(shù):軸,可選參數(shù)。
a=np.arange(24).reshape(4,6) print(a) pp.pprint(np.split(a,[2],axis=0)) ''' [[ 0 1 2 3 4 5] [ 6 7 8 9 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23]] [array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]]), array([[12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]])] '''
上面這個(gè)例子里,我們選擇了第一條軸,也就是列方向。然后找到第二行一分為二。
a=np.arange(24).reshape(2,3,4) print(a) pp.pprint(np.split(a,[1],axis=0))#沿第一條軸,高 pp.pprint(np.split(a,[1],axis=1))#沿第二條軸,寬 pp.pprint(np.split(a,[1],axis=2))#沿第三條軸,長(zhǎng) ''' [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]] [array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]]), array([[[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])] [array([[[ 0, 1, 2, 3]], [[12, 13, 14, 15]]]), array([[[ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[16, 17, 18, 19], [20, 21, 22, 23]]])] [array([[[ 0], [ 4], [ 8]], [[12], [16], [20]]]), array([[[ 1, 2, 3], [ 5, 6, 7], [ 9, 10, 11]], [[13, 14, 15], [17, 18, 19], [21, 22, 23]]])] '''
上面是一個(gè)三維數(shù)組切割的例子。
2.垂直分割
vsplit函數(shù)和split函數(shù)
沿垂直方向,就是沿行方向,沿第一條軸(axis=0)方向。
split函數(shù)如上,改一條軸參數(shù)即可。
3.深度分割
dsplit函數(shù)
主要用于三維數(shù)組,其實(shí)就是沿第三條軸切割,就好比從上方切蛋糕一樣。
a=np.arange(24).reshape(2,3,4) b=np.dsplit(a,4)#把這個(gè)蛋糕從上切成四份 pp.pprint(b) ''' [array([[[ 0], [ 4], [ 8]], [[12], [16], [20]]]), array([[[ 1], [ 5], [ 9]], [[13], [17], [21]]]), array([[[ 2], [ 6], [10]], [[14], [18], [22]]]), array([[[ 3], [ 7], [11]], [[15], [19], [23]]])] '''
到此這篇關(guān)于Numpy數(shù)組的組合與分割實(shí)現(xiàn)的方法的文章就介紹到這了,更多相關(guān)Numpy數(shù)組組合與分割內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。