2014-06-26 91 views
4

我會保持它簡單。我有一個循環將新行添加到numpy數組中...什麼是有效的方法來做到這一點。添加numpy數組的有效方法

n=np.zeros([1,2]) 
for x in [[2,3],[4,5],[7,6]] 
     n=np.append(n,x,axis=1) 

現在的事情是有一個[0,0]堅持它,所以我必須通過

del n[0] 

這似乎啞刪除它......所以,請告訴我一個有效的方式來做這個。

n=np.empty([1,2]) 

更糟糕的是它會創建一個未初始化的值。

+0

爲什麼不只是'n = np.array([[2,3],[4,5],[7,6]])'? – BrenBarn

+0

這僅僅是一個例子,在我的程序中,每次迭代都會附加一個不同的值 – user3443615

+1

追加到numpy數組本身效率低下,所以這種方法永遠不會是一個很好的性能。 – BrenBarn

回答

5

有三種方法可以做到這一點,如果你已經在列表中的一切:

data = [[2, 3], [4, 5], [7, 6]] 
n = np.array(data) 

如果您知道最終的陣列將有多大:

exp = np.array([2, 3])  

n = np.empty((3, 2)) 
for i in range(3): 
    n[i, :] = i ** exp 

如果你不」知道最後的陣列將有多大:

exp = np.array([2, 3]) 

n = [] 
i = np.random.random() 
while i < .9: 
    n.append(i ** exp) 
    i = np.random.random() 
n = np.array(n) 

公正或記錄,你可以用n = np.empty((0, 2))開始,但我禾不建議在循環中追加到該數組。

+2

所有方法使用列表...是不是有一種方法可以在np.arrays中完全做到這一點...不能讓這些numpy的人找出一個辦法?和'n = np.empty((0,2))'不起作用 – user3443615

+1

我100%保證'n = np.empty((0,2))'起作用。你不必使用列表,但你必須使用一些東西。你的數據不能來自稀薄的空氣,它在被放入一個數組(即一個文件,另一個數組,一個列表,一個元組,一個雙精度...)之前必須處於某種結構中。 –

+0

同樣在第三種情況下,當您不知道數組的最終大小時,我故意使用了一個列表。 Python列表實際上是作爲[動態數組](http://en.wikipedia.org/wiki/Dynamic_array)實現的,這就是你想要的最後一種情況。 Numpy數組不是動態數組,因此您最好使用列表。 –

0

你可能也想嘗試:

import numpy as np 

n = np.reshape([], (0, 2)) 
for x in [[2,3],[4,5],[7,6]]: 
     n = np.append(n, [x], axis=0) 

相反np.append,你也可以使用n = np.vstack([n,x])。我也同意@Bi Rico,如果n不需要在循環中訪問,我也會使用一個列表。

6

有關「爲什麼列表」部分的技術說明。

在內部,未知長度列表的問題在於它需要以某種方式適合內存,而不管其長度如何。基本上有兩種不同的可能性:

  1. 使用的數據結構(鏈表,一些樹結構等),其使得能夠爲列表中的每個新的元素分別分配內存。

  2. 將數據存儲在連續的存儲區中。這個區域必須在列表創建時分配,並且必須比我們最初需要的大。如果我們在列表中添加更多內容,我們需要嘗試分配更多內存,最好是在相同的位置。如果我們無法在同一地點完成,我們需要分配一個更大的塊並移動所有數據。

第一種方法使各種花式插入和刪除選項,排序等。然而,它是在順序讀取速度較慢,分配更多的存儲器。 Python實際上使用方法#2,列表被存儲爲「動態數組」。有關更多信息,請訪問:

Size of list in memory

這意味着該列表的設計是非常有效的配合使用append。如果事先不知道列表的大小,你可以做的事情很少。


如果你知道即使是列表的最大尺寸事先,你可能是最好關閉用numpy.empty(不numpy.zeros)的最大尺寸,然後用ndarray.resize收縮陣列一旦你填寫分配numpy.array所有數據。

出於某種原因numpy.array(l),其中l是一個列表是經常用較大名單慢,而複製甚至大型陣列是相當快的(我只是嘗試創建一個100 000 000元素數組的副本;花少於0.5秒)。

這個討論有不同的選擇更多標杆:

Fastest way to grow a numpy numeric array

我沒有基準的numpy.empty + ndarray.resize組合,但兩者應該是相當微秒不是毫秒操作。

+0

Python列表是一種同時使用(1)和(2),因爲每個對象都有自己的分配,而列表元素只是它的引用。與一個numpy記錄數組進行比較,其中每個記錄以內聯方式存儲該陣列緊湊地使用(2)策略。他們區別的是他們的分配策略;該清單將分配額外的容量。 (1)因素確保列表中的每個插槽本身都很小,所以未使用的容量不會花費太多。 – bluss

+0

我發現在我的例子中至少有一個最好的解決方案是預先分配一個足夠大的空間,然後改變它並移動自定義的「長度」變量。需要多一點工作,但性能是值得的。 –