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