Как я могу построить массив из объекта генератора?
Позвольте мне проиллюстрировать проблему:
>>> 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])
В данном случае gimme()
это генератор, вывод которого я бы хотел превратить в массив. Однако конструктор массива не выполняет итерацию по генератору, он просто хранит сам генератор. Я хочу получить такое поведение numpy.array(list(gimme()))
, но я не хочу платить за использование промежуточного списка и окончательного массива в памяти одновременно. Есть ли более экономичный способ?
numpy
не может (или не хочет) обращаться с генераторами, как это делает Python, по крайней мере, он должен вызвать исключение, когда получает генератор в качестве аргумента.
from numpy import *; print any(False for i in range(1))
- который затеняет встроенноеany()
и дает противоположный результат (как я знаю сейчас).