结合NumPy数组

时间:2011-07-18 22:45:30

标签: python arrays numpy

我有两个20x100x3 NumPy阵列,我希望将它们组合成一个40 x 100 x 3阵列,也就是说,只需在阵列中添加更多行。我对我想要的功能感到困惑:它是vstack,hstack,column_stack还是其他什么东西?

5 个答案:

答案 0 :(得分:25)

我相信这是你想要的vstack

p=array_2
q=array_2
p=numpy.vstack([p,q])

答案 1 :(得分:15)

最好的学习方法之一是尝试,但我会说你想要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.concatenatenp.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

答案 2 :(得分:10)

可能值得一提

    np.concatenate((a1, a2, ...), axis=0) 

是一般形式,vstack和hstack是特定情况。我发现最容易知道我想要堆叠哪个维度并将其作为np.concatenate的参数提供。

答案 3 :(得分:4)

我在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倍!

答案 4 :(得分:3)

顺便说一下,还有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