numpy的stack、hstack、vstack、concatenate
这几个函数都是对数组进行连接,介绍下区别
函数 | 增加维度 | 指定维度操作 | 数组shape要求 |
---|---|---|---|
concatenate | 不增加 | 能 | 除了操作维度,其它必须相同 |
stack | 增加 | 能 | 必须完全相同 |
hstack | 不增加 | 不能 | 除了操作维度,其它必须相同 |
vstack | 不增加 | 不能 | 除了操作维度,其它必须相同 |
从上表就可以看出,concatenate和stack的区别就在于会不会增加维度
a = np.arange(12).reshape(2, 6)
b = np.arange(12).reshape(2, 6)
c = np.concatenate([a, b], axis=0)
d = np.stack([a, b], axis=0)
得到结果
In [20]: c
Out[20]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
In [21]: d
Out[21]:
array([[[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]],
[[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]])
看上去好像相同,但是仔细看就会发现区别
In [23]: c.shape
Out[23]: (4, 6)
In [24]: d.shape
Out[24]: (2, 2, 6)
c没有增加维度,在指定的0维它的size是两个数组的和,d在0维增加了一个维度。
hstack和vstack其实和concatenate更像,它们的输入参数只有数组,不能指定维度,这两个函数可以用concatenate等价实现,如下
np.hstack([a, b]) == np.concatenate([a, b], axis=1)
np.vstack([a, b]) == np.concatenate([a, b], axis=0)
建议:
- 少使用hstack和vstack,它们的使用和stack有较大差异,建议用concatenate代替
- 需要牢记stack增加维度,concatenate不增加