數(shù)組高階操作函數(shù)(上)
Numpy 提供了一系列針對(duì)數(shù)組操作的高階函數(shù)。其中一類比較常見(jiàn)的是數(shù)組的合并。
1. 數(shù)組的合并與堆疊
1.1 numpy.concatenate 函數(shù)
numpy.concatenate 函數(shù)用于沿指定軸連接兩個(gè)或多個(gè)相同形狀的數(shù)組。該函數(shù)的原型如下:
numpy.concatenate((a1, a2, ...), axis=0)
參數(shù)說(shuō)明如下:
參數(shù) | 說(shuō)明 |
---|---|
a1,a2 … | 相同類型的數(shù)組序列 |
axis | 連接數(shù)組的軸的方向,默認(rèn)值為0 |
案例
創(chuàng)建大小為 2×2 的二維數(shù)組 a 和 b:
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
查看數(shù)組:
print("數(shù)組a:")
print(a)
print("數(shù)組b:")
print(b)
打印結(jié)果為:
數(shù)組a:
[[1 2]
[3 4]]
數(shù)組b:
[[5 6]
[7 8]]
利用 concatenate 函數(shù)進(jìn)行垂直方向的合并:
np.concatenate((a, b), axis=0)
out:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
上述語(yǔ)句實(shí)現(xiàn)了:沿著 axis=0(對(duì)于二維數(shù)組,顯示為垂直)方向合并,合并的結(jié)果在垂直方向的維數(shù)擴(kuò)充到 4,整個(gè)結(jié)果的數(shù)組大小為 4×2。
利用 concatenate 函數(shù)進(jìn)行水平方向的合并:
np.concatenate((a, b), axis=1)
out:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
上述語(yǔ)句實(shí)現(xiàn)了:沿著 axis=1(對(duì)于二維數(shù)組,顯示為水平)方向合并,合并的結(jié)果在水平方向的維數(shù)擴(kuò)充到 4,整個(gè)結(jié)果的數(shù)組大小為 1×4。
通過(guò)觀察上述過(guò)程,可以發(fā)現(xiàn):concatenate 可以實(shí)現(xiàn)數(shù)組沿著某一軸向進(jìn)行合并,合并后數(shù)組的維度保持不變。
案例
numpy.concatenate 函數(shù)可以一次性拼接多個(gè)數(shù)組:
np.concatenate((a, b, a, b), axis=1)
out:
array([[1, 2, 5, 6, 1, 2, 5, 6],
[3, 4, 7, 8, 3, 4, 7, 8]])
concatenate 函數(shù)可以接收不定長(zhǎng)的數(shù)組序列,并按照指定的軸進(jìn)行合并。
1.2 numpy.stack函數(shù)
numpy.stack 函數(shù)沿指定軸連接數(shù)組序列,該函數(shù)的原型如下:
numpy.stack((a1, a2, ...), axis=0)
參數(shù)說(shuō)明如下:
參數(shù) | 說(shuō)明 |
---|---|
a1,a2 … | 相同類型的數(shù)組序列 |
axis | 連接數(shù)組的軸的方向,默認(rèn)值為0 |
案例
仍然指定拼接方向?yàn)?axis=0 方向,觀察與 concatenate 函數(shù)的區(qū)別:
np.stack((a, b), axis=0)
該語(yǔ)句實(shí)現(xiàn)了把數(shù)據(jù) a 和 b 在 axis=0(最外層)增加一層,進(jìn)行堆疊:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
堆疊的結(jié)果為三維數(shù)組,其中 axis=0 方向(最外層)的組成元素分別對(duì)應(yīng)為 a 和 b。
案例
指定拼接方向?yàn)?axis=1 方向,觀察與 concatenate 函數(shù)的區(qū)別:
np.stack((a, b), axis=1)
該語(yǔ)句實(shí)現(xiàn)了把數(shù)據(jù) a 和 b 在 axis=1 增加一層,再進(jìn)行堆疊:
array([[[1, 2],
[5, 6]],
[[3, 4],
[7, 8]]])
具體堆疊過(guò)程可以按照拆解為如下步驟:
- 數(shù)組 a 和 b分別由 2×2 擴(kuò)充為 2×1×2,在 axis=1 的維度實(shí)現(xiàn)了擴(kuò)充;
- 在擴(kuò)充的軸上進(jìn)行堆疊,即在 axis=1 的軸上進(jìn)行堆疊。
1.3 numpy.hstack 函數(shù)
對(duì)于二維數(shù)組,在水平方向進(jìn)行堆疊,但是數(shù)組的維度保持不變。函數(shù)效果等價(jià)于numpy.concatenate((a1, a2, …), axis=1)。
案例
利用 hstack 函數(shù)合并數(shù)組 a 和 b:
np.hstack((a,b))
out:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
上述效果與 np.concatenate((a, b), axis=1) 完全一致。
1.4 numpy.vstack函數(shù)
對(duì)于二維數(shù)組,在垂直方向進(jìn)行堆疊,但是數(shù)組的維度保持不變。函數(shù)效果等價(jià)于numpy.concatenate((a1, a2, …), axis=0)。
案例
利用 hstack 函數(shù)合并數(shù)組 a 和 b:
np.vstack((a,b))
out:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
上述效果與np.concatenate((a, b), axis=0)完全一致。
2. 小結(jié)
本節(jié)講述了數(shù)組合并與堆疊的幾種常用方法,其中concatenate函數(shù)與stack函數(shù)需要在使用中指定具體的計(jì)算方向,而vstack和hstack則默認(rèn)了合并方向,使用過(guò)程中注意區(qū)分。