【发布时间】:2011-10-08 02:13:14
【问题描述】:
我有两个 20x100x3 NumPy 数组,我想将它们组合成一个 40 x 100 x 3 数组,也就是说,只需在数组中添加更多行。我对我想要哪个函数感到困惑:它是 vstack、hstack、column_stack 还是其他什么?
【问题讨论】:
我有两个 20x100x3 NumPy 数组,我想将它们组合成一个 40 x 100 x 3 数组,也就是说,只需在数组中添加更多行。我对我想要哪个函数感到困惑:它是 vstack、hstack、column_stack 还是其他什么?
【问题讨论】:
我相信你想要的是 vstack
p=array_2
q=array_2
p=numpy.vstack([p,q])
【讨论】:
stack 或 concatenate,并且仅支持 vstack 以实现向后兼容性,请参阅:docs.scipy.org/doc/numpy-1.13.0/reference/generated/…
最好的学习方法之一是实验,但我想说你想要np.vstack,尽管还有其他方法可以做同样的事情:
a = np.ones((20,100,3))
b = np.vstack((a,a))
print b.shape # (40,100,3)
或
b = np.concatenate((a,a),axis=0)
编辑
请注意,在我的机器上,对于 OP 问题中的大小数组,我发现 np.concatenate 比 np.vstack 快大约 2 倍
In [172]: a = np.random.normal(size=(20,100,3))
In [173]: c = np.random.normal(size=(20,100,3))
In [174]: %timeit b = np.concatenate((a,c),axis=0)
100000 loops, best of 3: 13.3 us per loop
In [175]: %timeit b = np.vstack((a,c))
10000 loops, best of 3: 26.1 us per loop
【讨论】:
np.concatenate 进行基准测试(它似乎是自动选择的),但这里重要的数字是每个循环的时间
值得一提的是
np.concatenate((a1, a2, ...), axis=0)
是一般形式,vstack 和 hstack 是具体情况。我发现最容易知道我想要堆叠哪个维度并将其作为参数提供给 np.concatenate。
【讨论】:
我在 r_ 和 vstack 之间尝试了一个小基准测试,结果非常有趣:
import numpy as np
NCOLS = 10
NROWS = 2
NMATRICES = 10000
def mergeR(matrices):
result = np.zeros([0, NCOLS])
for m in matrices:
result = np.r_[ result, m]
def mergeVstack(matrices):
result = np.vstack(matrices)
def main():
matrices = tuple( np.random.random([NROWS, NCOLS]) for i in xrange(NMATRICES) )
mergeR(matrices)
mergeVstack(matrices)
return 0
if __name__ == '__main__':
main()
然后我运行分析器:
python -m cProfile -s cumulative np_merge_benchmark.py
结果:
ncalls tottime percall cumtime percall filename:lineno(function)
...
1 0.579 0.579 4.139 4.139 np_merge_benchmark.py:21(mergeR)
...
1 0.000 0.000 0.054 0.054 np_merge_benchmark.py:27(mergeVstack)
所以 vstack 方式快 77 倍!
【讨论】:
对了,还有r_:
>>> from scipy import *
>>> a = rand(20,100,3)
>>> b = rand(20,100,3)
>>> a.shape
(20, 100, 3)
>>> b.shape
(20, 100, 3)
>>> r_[a,b].shape
(40, 100, 3)
>>> (r_[a,b] == vstack([a,b])).all()
True
【讨论】: