Python / 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]]])

具体堆叠过程可以按照拆解为如下步骤:

  1. 数组 a 和 b分别由 2×2 扩充为 2×1×2,在 axis=1 的维度实现了扩充;
  2. 在扩充的轴上进行堆叠,即在 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则默认了合并方向,使用过程中注意区分。