¿Cómo puedo construir una matriz numpy a partir de un objeto generador?
Déjame ilustrar el problema:
>>> 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])
En este caso, gimme()
es el generador cuya salida me gustaría convertir en una matriz. Sin embargo, el constructor de matriz no itera sobre el generador, simplemente almacena el generador en sí. El comportamiento que deseo es ese numpy.array(list(gimme()))
, pero no quiero pagar la sobrecarga de memoria de tener la lista intermedia y la matriz final en la memoria al mismo tiempo. ¿Hay una manera más eficiente en el espacio?
numpy
no puede (o no quiere) tratar a los generadores como lo hace Python, al menos debería generar una excepción cuando recibe un generador como argumento.
from numpy import *; print any(False for i in range(1))
, que sombrea el incorporadoany()
y produce el resultado opuesto (como lo sé ahora).