2012-04-12 33 views
22

我希望能夠'快速'構建一個numpy數組,我不知道這個數組的大小。初始化未知長度的numpy數組

比如我想做的事情是這樣的:

a= np.array() 
for x in y: 
    a.append(x) 

這將導致x的包含所有要素,顯然這是一個簡單的答案。我只是好奇這是否可能?

+2

什麼可能是更有效的方法是分配一些大型數組,每次達到容量時將其大小加倍。 – wim 2013-04-24 01:09:43

回答

48

建立一個Python列表,將其轉換成一個NumPy的陣列。這需要爲每次追加+ O(n)分配O(1)時間以轉換爲陣列,總共爲O(n)。

a = [] 
    for x in y: 
     a.append(x) 
    a = np.array(a) 
+0

還是更好些:'a = np.array([x for x in y])';或只是'a = np.array(list(y))' – 2018-01-19 23:58:39

8

你可以這樣做:

a = np.array([]) 
for x in y: 
    a = np.append(a, x) 
+5

每次追加需要線性時間。 – 2012-04-12 11:02:02

+6

這種方法每次追加都會複製數組,即O(sum(range(n)))。在我的筆記本電腦上,這個方法比@ larsman's方法慢了42倍:按照larsman方法建立一個列表需要1000個循環,最好是3:每個循環1.53 ms。按照這個方法,我需要10個循環,每個循環最好是3:64.8 ms。 – 2013-02-14 21:59:10

1

對於後人,我想這是更快:

a = np.array([np.array(list()) for _ in y]) 

你甚至可以在發電機傳遞(即[] - >()),在這種情況下,內部列表從未完全存儲在內存中。


迴應如下評論:

>>> import numpy as np 
>>> y = range(10) 
>>> a = np.array([np.array(list) for _ in y]) 
>>> a 
array([array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object)], dtype=object) 
+0

我在這裏做了一個修改:list(_),並且工作得很好 – javadba 2013-12-04 03:37:38

+0

要清楚@javadba,你不需要那樣做 - 我是肯定有一些Pythonistas誰會冒犯:) – BenDundee 2013-12-04 13:48:23

+0

這不是一個風格的問題。沒有列表(_)它甚至不能工作在最後我的情況下,y是一個數組本身 – javadba 2013-12-04 16:54:07

0
a = np.empty(0) 
for x in y: 
    a = np.append(a, x) 
4

因爲y是一個迭代我真的不明白,爲什麼呼籲追加:

a = np.array(list(y)) 

會做,這是多少更快:

import timeit 

print timeit.timeit('list(s)', 's=set(x for x in xrange(1000))') 
# 23.952975494633154 

print timeit.timeit("""li=[] 
for x in s: li.append(x)""", 's=set(x for x in xrange(1000))') 
# 189.3826994248866