Comment puis-je construire un tableau numpy à partir d'un générateur?

Comment puis-je construire un tableau numpy d'un générateur d'objet?

Permettez-moi d'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 ce cas, donnez-moi de la() est le générateur dont la sortie j'aimerais tourner dans un tableau. Toutefois, la gamme du constructeur de ne pas effectuer une itération sur le générateur, il enregistre simplement le générateur lui-même. Le comportement que je désire, c'est que de numpy.tableau(liste(gimme())), mais je ne veux pas payer la surcharge de la mémoire d'avoir l'intermédiaire de la liste et le tableau final dans la mémoire en même temps. Est-il plus d'espace-efficace?

  • C'est une question intéressante. Je suis tombé sur ce par from numpy import *; print any(False for i in range(1)) - qui masque le haut-any() et produit le résultat inverse (comme je le sais maintenant).
  • c'est terrible. si numpy ne peut pas (ou ne veut pas) pour traiter les générateurs de Python n'a, au moins, il devrait soulever une exception lorsqu'il reçoit un générateur comme argument.
  • J'ai exactement la même mine. Apparemment, cela a été soulevée sur le NumPy liste (et précédente) concluant que ce ne sera pas modifié pour lever exception et on devrait toujours utiliser des espaces de noms.
InformationsquelleAutor saffsd | 2008-12-15