目录

NumPy的中各种stacking操作

目录

NumPy的中各种stacking操作

当我们需要对多个向量或者矩阵做合并以及堆叠操作时,就需要用到stacking方法。

NumPy中提供了多个stacking方法,常用的有 vstack , hstack , column_stack 以及 concatenate .

  • vstack: 沿输入数组的第一个维度进行堆叠
>>> rg = np.random.default_rng(1)
>>> a = np.floor(10 * rg.random((2, 2)))

>>> a
array([[9., 7.],
       [5., 2.]])

>>> b = np.floor(10 * rg.random((2, 2)))

>>> b
array([[1., 9.],
       [5., 1.]])

>>> np.vstack((a, b))
array([[9., 7.],
       [5., 2.],
       [1., 9.],
       [5., 1.]])

此时,数组a, b均为二维数组,第一个维度也就是最左边的索引为列的方向,因此vstack将两个数组的行向量沿列的方向进行堆叠。

  • hstack: 沿输入数组的第二个维度进行堆叠
>>> np.hstack((a, b))
array([[9., 7., 1., 9.],
       [5., 2., 5., 1.]])

a和b的第二个维度是行的方向,所以hstack的结果是将两个数组沿每一行分别进行堆叠。

  • column_stack: 将多个1维数组作为列堆叠成一个2维数组
>>> a = np.array((1,2,3))

>>> b = np.array((2,3,4))

>>> np.column_stack((a,b))
array([[1, 2],
       [2, 3],
       [3, 4]])

本质上column_stack相当于hstack的一种特殊形式。在实现过程中,column_stack会先将输入数组扩展成二维,然后再用hstack进行堆叠。因此,其具体过程等价于

>>> from numpy import newaxis
>>> a[:, newaxis]
array([[1],
       [2],
       [3]])
>>> b[:, newaxis]
array([[2],
       [3],
       [4]])
>>> np.hstack((a[:, newaxis], b[:, newaxis]))
array([[1, 2],
       [2, 3],
       [3, 4]])

虽然从定义上column_stack只对一维数组进行操作,但是实际使用中如果输入数组的维度大于1,则其结果等同于hstack

>>> a
array([[5., 9.],
       [1., 9.]])
>>> b = np.floor(10 * rg.random((2, 2)))
>>> b
array([[3., 4.],
       [8., 4.]])
>>> np.column_stack((a, b))
array([[5., 9., 3., 4.],
       [1., 9., 8., 4.]])
  • concatenate: 相当于vstack和hstack的通用形式。相对于只能沿一个固定维度进行堆叠,concatenate可以指定进行堆叠的维度
>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])