2012-11-06 38 views
6

我有一個numpy矩陣,並想將所有行連接在一起,所以我最終得到一個長數組。在Python中連接numpy矩陣的所有行

#example 

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

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

我現在這樣做的方式似乎並不pythonic。我確信有更好的方法。

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

謝謝你的幫助。

+0

@senderle - 拉威爾是我的第一直覺太(感謝皮埃爾GM!) 。發佈作爲答案,我會愉快地upvote。 – mgilson

回答

7

我建議的ndarrayravelflatten方法。

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

ravelconcatenateflatten更快,因爲它沒有返回副本,除非它具有:

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

但是如果你需要的副本,以避免記憶上面分享所示,你」重新使用flattenconcatenate更好,因爲你可以從這些時間看:

>>> %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 

ñ OTE也可以實現確切結果是你的輸出說明(1列2-d陣列)與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尼斯分析,你每天都會學到新的東西。 – Maehler

+1

請注意,'ravel'或'flatten'會將您的二維數組轉換爲一維數組---即從(N,M)'切換到(N * M)'形狀。 OP可能想要添加一個'.reshape(1,-1)'來強制輸出到一個二維數組(1行,多列)。 –

+0

當然,如果你只想將你的二維數組轉換成一維數組,更快的是'your_array.shape = -1' ... –

3

您可以使用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]) 

您也可以嘗試flatten

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

似乎正是用戶想要的。 – orlp

+0

完美!謝謝 – user1764386