numpy数组的堆叠:numpy.stack, numpy.hstack, numpy.vstack

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy数组的堆叠:numpy.stack, numpy.hstack, numpy.vstack相关的知识,希望对你有一定的参考价值。

参考技术A

stack 是指维度域的堆叠

numpy.hstack 与 numpy.vstack 对维度低于3的数组较为有用(能较好理解堆叠的过程)。

官方文档给出的定义是:对数组进行水平向(列)堆叠。该过程与第二维度(axis=1)的数组拼接(concatenation)是等价的,但是 1维数组除外 ,因其只具有一个维度,故是在第一个维度进行拼接。

给出如下例子(一):

输出为:

下面给出二维数组的堆叠示例(二):

输出为:

可以看出,numpy.hstack在水平向(列)堆叠是在两个数组arr1与arr2的第二个维度进行拼接。在上述例子中,第一个维度的size保持为 2 ,第二个维度的size因为拼接的缘故,增长为 3+3=6

下面再给一个trick,如果例子(一)的数组a与b的形状变为二维,那么结果是否会变化呢?例(三)

输出结果为:

例(四)。我们对例(一)进行修改,使用numpy.stack并指定堆叠的维度为0:

输出结果为:

根据例(一),(二),(三),(四),我们可以看出,numpy.hstack进行的 列维度堆叠 表现为: 行维度不变,列维度增加

官方文档给出的定义是:对数组进行垂直向(行)堆叠。该过程与第一维度(axis=0)的数组连接(concatenation)是等价的。对于一维数组(N,),该方法首先将其转换为(1, N)形状,而后进行堆叠。
例(五):

输出结果为:

可以看出,对一维数组而言, numpy.stack((a, b), axis=0) 与 np.vstack((a, b)) 是等价的。

例(六):

输出结果为:

根据例(五)(六),我们可以看出,np.vstack在 行纬度的堆叠 体现在: 行维度增加,列维度保持不变

numpy.stack vs concatenate vs hstack vs vstack

官方文档的解释如下:

stack:

Join a sequence of arrays along a new axis

concatenate:

Join a sequence of arrays along a existing axis

因此stack 是在新轴axis=n上加入矩阵,已有的axis>=n往后挪动,譬如以前的axis=n挪动到axis=n+1上

而concatenate是在已有的轴axis=n上加入矩阵。

 

 

stack 例子:

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

concatenate例子:

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



hstack:

Equivalent to np.cancatenate(tup, axis=1), if tup contains arrays that are at least 2-dimensional.

vstack:

Equivalent to np.cancatenate(tup, axis=0), if tup contains arrays that are at least 2-dimensional.

因此当hstack 和 vstack 在维度等于1时,其作用相当于stack, 创建新轴。

而当维度大于等于2时,其作用相当于cancatenate, 在已有轴上进行操作。

以上是关于numpy数组的堆叠:numpy.stack, numpy.hstack, numpy.vstack的主要内容,如果未能解决你的问题,请参考以下文章

python numpy.row_stack?想知道怎么修改

numpy.array()是否等于numpy.stack(...,axis = 0)?

Numpy Column Stack with Strings?

以有效的方式将dict中的所有项目作为参数传递

Python数据分析-堆叠数组函数总结

堆叠不同大小图像的 Numpy 数组