2012-11-06 37 views
6

Tôi có ma trận khối u và muốn nối tất cả các hàng lại với nhau để tôi kết thúc bằng một mảng dài.Ghép nối tất cả các hàng của ma trận khối u trong trăn

#example 

input: 
[[1 2 3] 
[4 5 6} 
[7 8 9]] 

output: 
[[1 2 3 4 5 6 7 8 9]] 

Cách tôi hiện đang làm điều đó dường như không có vẻ thiên vị. Tôi chắc chắn có một cách tốt hơn.

combined_x = x[0] 
for index, row in enumerate(x): 
    if index!= 0: 
     combined_x = np.concatenate((combined_x,x[index]),axis=1) 

Cảm ơn sự giúp đỡ của bạn.

+0

@senderle - Ravel là bản năng đầu tiên của tôi quá (nhờ Pierre GM!) . Đăng như một câu trả lời và tôi sẽ vui vẻ upvote. – mgilson

Trả lời

7

tôi sẽ đề nghị các ravel hoặc flatten phương pháp ndarray.

>>> a = numpy.arange(9).reshape(3, 3) 
>>> a.ravel() 
array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 

ravel nhanh hơn concatenateflatten bởi vì nó không trả về một bản sao trừ khi nó phải:

>>> a.ravel()[5] = 99 
>>> a 
array([[ 0, 1, 2], 
     [ 3, 4, 99], 
     [ 6, 7, 8]]) 
>>> a.flatten()[5] = 77 
>>> a 
array([[ 0, 1, 2], 
     [ 3, 4, 99], 
     [ 6, 7, 8]]) 

Nhưng nếu bạn cần một bản sao để tránh bộ nhớ chia sẻ được minh họa ở trên, bạn' tái nên sử dụng flatten hơn concatenate, như bạn có thể nhìn thấy từ những timings:

>>> %timeit a.ravel() 
1000000 loops, best of 3: 468 ns per loop 
>>> %timeit a.flatten() 
1000000 loops, best of 3: 1.42 us per loop 
>>> %timeit numpy.concatenate(a) 
100000 loops, best of 3: 2.26 us per loop 

N ote cũng là bạn có thể đạt được chính xác kết quả là đầu ra của bạn minh họa (một hàng 2-d mảng) với reshape:

>>> a = numpy.arange(9).reshape(3, 3) 
>>> a.reshape(1, -1) 
array([[0, 1, 2, 3, 4, 5, 6, 7, 8]]) 
>>> %timeit a.reshape(1, -1) 
1000000 loops, best of 3: 736 ns per loop 
+0

+1 Phân tích tốt đẹp, bạn học được điều gì đó mới mẻ mỗi ngày. – Maehler

+1

Lưu ý rằng 'ravel' hoặc' flatten' sẽ biến mảng 2D của bạn thành mảng 1D --- nghĩa là, chuyển từ một '(N, M)' sang dạng '(N * M,)'. OP có thể muốn thêm '.reshape (1, -1)' để ép đầu ra thành mảng 2D (1 hàng, nhiều cột). –

+0

Tất nhiên, nếu bạn muốn biến mảng 2D thành 1D, nhanh hơn là 'your_array.shape = -1' ... –

3

Bạn có thể sử dụng NumPy concatenate function:

>>> ar = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
>>> np.concatenate(ar) 
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 

Bạn cũng có thể thử flatten:

>>> ar.flatten() 
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
+0

Có vẻ chính xác những gì người dùng muốn. – orlp

+0

Hoàn hảo! cảm ơn bạn – user1764386

Các vấn đề liên quan