Як я можу створити масивний масив із об'єкта генератора?
Дозвольте проілюструвати проблему:
>>> 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()
і дає протилежний результат (як я зараз знаю).