2011-07-18 12 views
8

私は2つの20x100x3 NumPyアレイを40×100×3アレイに結合したい、つまりアレイにもっと多くのラインを追加するだけです。私は、私が望む機能によって混乱しています。それはvstack、hstack、column_stackなのでしょうか?NumPyアレイを組み合わせる

答えて

23

私が試している、それはあなたが学習の最良の方法の

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

私が最初にページにアクセスしたときにあなたの答えが表示されなかった理由がわかりません。最初にvstackを提案するための+1。 – JoshAdel

+0

ドキュメントに 'stack'や' concatenate'を使用することが提案されており、そのvstackは下位互換性のためにのみサポートされていますので、ご注意ください:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/ numpy.vstack.html – NOhs

13

一つにしたいvstackだと信じていますが、同じことをやって、他の方法がありますが、私はあなたが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) 

EDIT

ちょうどメモとして、OPの問題のサイズの配列のための私のマシン上で、私はnp.concatenateは言及する価値があるかもしれませんnp.vstack

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 
+0

奇妙なことですが、ありがとうございました。今、私は最初のコメントを残すことができます。 – Giltech

+0

私はtimeitをあまり使用していないのでここでは愚かであるかもしれませんが、連結するのに10倍ものループを取らないのですか? – Giltech

+1

@Giltech、timeitは10倍のループを使って 'np.concatenate'のベンチマークを行います(これは自動的に選択されるようです)。ここで重要なのはループあたりの時間です – JoshAdel

9

比べて約2倍高速であることを見つけること

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

は一般的な形式で、vstackとhstackは特定のケースです。私は、どの次元を積み重ねたいのかを知ることが最も簡単で、np.concatenateの引数として提供するのが最も簡単です。ところで

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 
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倍高速です!