Wie kann ich aus einem Generatorobjekt ein Numpy-Array erstellen?
Lassen Sie mich das Problem veranschaulichen:
>>> import numpy
>>> def gimme():
... for x in xrange(10):
... yield x
...
>>> gimme()
<generator object at 0x28a1758>
>>> list(gimme())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numpy.array(xrange(10))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.array(gimme())
array(<generator object at 0x28a1758>, dtype=object)
>>> numpy.array(list(gimme()))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In diesem Fall gimme()
handelt es sich um den Generator, dessen Ausgabe ich in ein Array verwandeln möchte. Der Array-Konstruktor iteriert jedoch nicht über den Generator, sondern speichert einfach den Generator selbst. Das Verhalten, das ich mir wünsche, ist das von numpy.array(list(gimme()))
, aber ich möchte nicht den Speicheraufwand dafür bezahlen, dass die Zwischenliste und das endgültige Array gleichzeitig im Speicher sind. Gibt es einen platzsparenderen Weg?
numpy
Generatoren nicht wie Python behandelt werden können (oder wollen), sollte zumindest eine Ausnahme ausgelöst werden, wenn ein Generator als Argument empfangen wird.
from numpy import *; print any(False for i in range(1))
- was das Eingebaute beschattetany()
und das gegenteilige Ergebnis erzeugt (wie ich jetzt weiß).