¿Cómo puedo construir una matriz numpy a partir de un objeto generador?¿Cómo construyo una matriz numpy de un generador?
Vamos a 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, dame() es el generador cuya salida me gustaría convertir en una matriz. Sin embargo, el constructor de la matriz no itera sobre el generador, simplemente almacena el generador. El comportamiento que deseo es el de 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 uso del espacio?
Este es un tema interesante. Me encontré con esto por 'de numpy import *; print any (False for i in range (1)) '- que sombrea el built-in [' any() '] (http://docs.python.org/library/functions.html#any) y produce lo opuesto resultado (como sé ahora). – moooeeeep
@moooeeeep eso es terrible. si 'numpy' no puede (o no quiere) tratar generadores como lo hace Python, al menos debería generar una excepción cuando recibe un generador como argumento. – max
@max pisé exactamente la misma mina. Al parecer, esto se planteó [en la lista NumPy] (http://thread.gmane.org/gmane.comp.python.numeric.general/47681/focus=47702) (y [anterior] (http: //thread.gmane). .org/gmane.comp.python.numeric.general/13197)) concluyendo que esto no se cambiará para generar una excepción y que uno siempre debe usar espacios de nombres. – alexei