Comment puis-je créer un tableau numpy à partir d'un objet générateur?
Laissez-moi illustrer le problème:
>>> 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])
Dans cet exemple, gimme()
est le générateur dont je voudrais transformer la sortie en un tableau. Cependant, le constructeur de tableau n'itère pas sur le générateur, il stocke simplement le générateur lui-même. Le comportement que je désire est celui de numpy.array(list(gimme()))
, mais je ne veux pas payer la surcharge de mémoire d'avoir la liste intermédiaire et le tableau final en mémoire en même temps. Existe-t-il un moyen plus efficace d'espace?
numpy
ne peut pas (ou ne veut pas) traiter les générateurs comme le fait Python, au moins il devrait lever une exception lorsqu'il reçoit un générateur comme argument.
from numpy import *; print any(False for i in range(1))
- qui ombres le intégréany()
et produit le résultat opposé (comme je le sais maintenant).