我希望能夠'快速'構建一個numpy數組,我不知道這個數組的大小。初始化未知長度的numpy數組
比如我想做的事情是這樣的:
a= np.array()
for x in y:
a.append(x)
這將導致x的包含所有要素,顯然這是一個簡單的答案。我只是好奇這是否可能?
我希望能夠'快速'構建一個numpy數組,我不知道這個數組的大小。初始化未知長度的numpy數組
比如我想做的事情是這樣的:
a= np.array()
for x in y:
a.append(x)
這將導致x的包含所有要素,顯然這是一個簡單的答案。我只是好奇這是否可能?
建立一個Python列表,將其轉換成一個NumPy的陣列。這需要爲每次追加+ O(n)分配O(1)時間以轉換爲陣列,總共爲O(n)。
a = []
for x in y:
a.append(x)
a = np.array(a)
還是更好些:'a = np.array([x for x in y])';或只是'a = np.array(list(y))' – 2018-01-19 23:58:39
你可以這樣做:
a = np.array([])
for x in y:
a = np.append(a, x)
每次追加需要線性時間。 – 2012-04-12 11:02:02
這種方法每次追加都會複製數組,即O(sum(range(n)))。在我的筆記本電腦上,這個方法比@ larsman's方法慢了42倍:按照larsman方法建立一個列表需要1000個循環,最好是3:每個循環1.53 ms。按照這個方法,我需要10個循環,每個循環最好是3:64.8 ms。 – 2013-02-14 21:59:10
對於後人,我想這是更快:
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)
a = np.empty(0)
for x in y:
a = np.append(a, x)
因爲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
什麼可能是更有效的方法是分配一些大型數組,每次達到容量時將其大小加倍。 – wim 2013-04-24 01:09:43