2011-07-18 216 views
8

我有兩個20x100x3 NumPy陣列,我想組合成一個40 x 100 x 3陣列,也就是說,只需在陣列中添加更多行。我很困惑我想要什麼功能:它是vstack,hstack,column_stack還是其他的東西?組合NumPy陣列

回答

23

我相信這是你想要vstack

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

不確定爲什麼我第一次訪問該頁面時沒有顯示您的答案。 +1用於首先推薦vstack。 – JoshAdel

+0

請注意,文檔建議現在使用'stack'或'concatenate',並且vstack僅支持向後兼容性,請參閱:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/ numpy.vstack.html – NOhs

13

一的學習實驗的最佳方式,但我要說你想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大約爲2x比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

快可能是值得一提的

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和結果之間的一個小Benchmark是很有意思:

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倍快!