Jak mogę zbudować tablicę numpy z obiektu generatora?
Pozwólcie, że zilustruję problem:
>>> 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])
W tym przypadku gimme()
jest to generator, którego wyjście chciałbym zamienić na tablicę. Jednak konstruktor tablicy nie wykonuje iteracji po generatorze, po prostu przechowuje sam generator. Zachowanie, którego pragnę, jest takie numpy.array(list(gimme()))
, ale nie chcę płacić narzutu pamięci związanego z posiadaniem listy pośredniej i ostatniej tablicy w pamięci w tym samym czasie. Czy istnieje sposób bardziej efektywny przestrzennie?
numpy
nie może (lub nie chce) traktować generatorów tak, jak robi to Python, powinien przynajmniej zgłosić wyjątek, gdy otrzyma generator jako argument.
from numpy import *; print any(False for i in range(1))
- co zacienia wbudowaneany()
i daje odwrotny skutek (jak już wiem).