2011-07-18 64 views
8

Tôi có hai mảng 20x100x3 NumPy mà tôi muốn kết hợp thành một mảng 40 x 100 x 3, nghĩa là, chỉ cần thêm nhiều dòng hơn vào mảng. Tôi đang bối rối bởi chức năng mà tôi muốn: là nó vstack, hstack, column_stack hoặc có thể cái gì khác?Kết hợp các mảng NumPy

Trả lời

23

Tôi tin rằng đó là vstack bạn muốn

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

không chắc tại sao câu trả lời của bạn không hiển thị khi tôi truy cập trang lần đầu tiên. 1 để đề xuất vstack trước. – JoshAdel

+0

Xin lưu ý rằng tài liệu gợi ý sử dụng 'stack' hoặc' concatenate' ngày nay và vstack chỉ được hỗ trợ cho khả năng tương thích ngược xem: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/ numpy.vstack.html – NOhs

13

Một trong những cách tốt nhất để học tập đang thử nghiệm, nhưng tôi sẽ nói rằng bạn muốn np.vstack mặc dù có những cách khác để làm điều tương tự:

a = np.ones((20,100,3)) 
b = np.vstack((a,a)) 

print b.shape # (40,100,3) 

hoặc

b = np.concatenate((a,a),axis=0) 

EDIT

Cũng giống như một ghi chú, trên máy tính của tôi cho các mảng có kích thước trong câu hỏi của OP, tôi thấy rằng np.concatenate khoảng 2x nhanh hơn 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

lạ, nhưng cảm ơn và bây giờ tôi có thể để lại bình luận đầu tiên. – Giltech

+0

Tôi có thể, là ngu ngốc ở đây như tôi đã không được sử dụng timeit nhiều, nhưng không nối không mất 10x như nhiều vòng? – Giltech

+1

@Giltech, trong khi timeit sử dụng vòng lặp nhiều hơn 10 lần để chuẩn 'np.concatenate' (có vẻ như chọn tự động), số quan trọng ở đây là thời gian trên mỗi vòng – JoshAdel

9

Có thể là đáng nói đến là

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

là hình thức chung và vstack và hstack là trường hợp cụ thể. Tôi tìm thấy nó dễ nhất để chỉ biết kích thước mà tôi muốn ngăn xếp hơn và cung cấp đó là đối số để np.concatenate.

3

Bằng cách này, đó cũng là 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

tôi đã cố gắng một chút benchmark giữa r_ và vstack và kết quả là rất thú vị:

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() 

Sau đó, tôi chạy profiler:

python -m cProfile -s cumulative np_merge_benchmark.py 

và kết quả:

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) 

Vì vậy, cách vstack nhanh hơn 77 lần!