Ich möchte in der Lage sein, ein numpy-Array im Handumdrehen zu "bauen", ich kenne die Größe dieses Arrays nicht im Voraus.
Zum Beispiel möchte ich so etwas machen:
a= np.array()
for x in y:
a.append(x)
Was dazu führen würde, dass alle Elemente von x enthalten sind, ist dies offensichtlich eine triviale Antwort. Ich bin nur neugierig, ob das möglich ist.
Erstellen Sie eine Python-Liste und konvertieren Sie diese in ein Numpy-Array. Dies erfordert eine amortisierte O(1) Zeit pro Anhang + O ( n ) für die Umwandlung in ein Array, insgesamt also 0 ( n ).
a = []
for x in y:
a.append(x)
a = np.array(a)
Du kannst das:
a = np.array([])
for x in y:
a = np.append(a, x)
Da y ein Iterer ist, kann ich nicht verstehen, warum die Aufrufe angehängt werden:
a = np.array(list(y))
geht und es geht viel schneller:
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
Für die Nachwelt denke ich, dass dies schneller geht:
a = np.array([np.array(list()) for _ in y])
Sie können sogar einen Generator übergeben (d. H. [] -> ()). In diesem Fall wird die innere Liste nie vollständig im Speicher abgelegt.
Antwort auf folgenden Kommentar:
>>> 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)