2016-03-24 103 views
0

在Python中,我想要創建一個n-by-100矩陣,其中n的值在開始時未知。這種創建涉及在矩陣中連續添加一行。我已經嘗試了這種代碼是:將行附加到NumPy數組

x = numpy.zeros(100) 
while true: 
    y = loadrow(); # Load a 1-by-100 NumPy array for the new row 
    x = numpy.append(x, y, 0) 

然而,有三個問題與上面,這我有困難解決:

  1. x = numpy.zeros(100)初始化的矩陣的行100個零。但是,我希望第一行成爲我加載的第一行。如何創建一個空矩陣,只有在追加第一行時纔會給出數據?

  2. 該行x = numpy.append(x, y, 0)不會向矩陣x添加另一行。相反,它只是在第一行的末尾添加y,以創建更長的行。但如果我嘗試x = numpy.append(x, y, 1),這樣我追加到軸1,那麼我得到的錯誤:TypeError: Required argument 'object' (pos 1) not found

  3. 當我連續追加這樣的行時,似乎我一直在製作原始數組的副本,而隨着數組的增長,效率會很低。當我不知道最終數組的大小是什麼時,有沒有其他方法可以做到這一點?

謝謝!

+0

請參閱我的回答類似的問題[這裏](http://stackoverflow.com/questions/35818395/add-a-column-在-A-numpy的陣列-蟒/ 35828879#35828879)。 – bunji

+1

考慮使用列表,並在循環後,將其轉換爲numpy數組。 – Evert

回答

3

如果必須使用np.append這裏有一個辦法做到這一點

In [96]: arr=np.zeros((0,5),int) 

In [97]: for i in range(3): 
    arr=np.append(arr,np.arange(i,i+5).reshape(1,5),0) 
    ....:  

In [98]: arr 
Out[98]: 
array([[0, 1, 2, 3, 4], 
     [1, 2, 3, 4, 5], 
     [2, 3, 4, 5, 6]]) 

坦白說,我不喜歡append。人們會將它與列表追加混淆(你沒有),人們不理解維度,並且每次都重建數組。

看看它的代碼 - 看看它幹了什麼?

return concatenate((arr, values), axis=axis) 

另請參閱vstack, hstackdstack

但更好的是,使用列表追加

In [100]: alist=[] 

In [101]: for i in range(3): 
    alist.append(np.arange(i,i+5).reshape(1,5)) 
    .....:  

In [102]: np.concatenate(alist,axis=0) 
Out[102]: 
array([[0, 1, 2, 3, 4], 
     [1, 2, 3, 4, 5], 
     [2, 3, 4, 5, 6]])