Como criar uma matriz numpy a partir de um objeto gerador?
Deixe-me ilustrar o 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])
Neste exemplo, gimme()
é o gerador cuja saída eu gostaria de transformar em uma matriz. No entanto, o construtor do array não interage com o gerador, simplesmente armazena o próprio gerador. O comportamento que desejo é o denumpy.array(list(gimme()))
, mas não quero gastar a memória de ter a lista intermediária e a matriz final na memória ao mesmo tempo. Existe uma maneira mais eficiente em termos de espaço?
numpy
não puder (ou não quiser) tratar os geradores como o Python, pelo menos deve gerar uma exceção quando receber um gerador como argumento.
from numpy import *; print any(False for i in range(1))
- o que sombreia o built-inany()
e produz o resultado oposto (como eu sei agora).