Numpy 数组高阶操作函数(上)
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则默认了合并方向,使用过程中注意区分。