python – 如何从一个生成器构建numpy数组?

如何从一个生成器对象构建numpy数组?

让我举例说明问题:

>>> 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列表。这是必要的,使得每个项目的空间可以在存储器中连续分配。连续分配是numpy数组的关键特性:这与本地代码实现相结合,让它们对正常列表执行的操作更快。

记住这一点,技术上不可能取一个生成器对象并将其转换为数组,除非你:

>可以预测运行时将产生多少个元素:

my_array = numpy.empty(predict_length())
for i, el in enumerate(gimme()): my_array[i] = el

>愿意将它的元素存储在中间列表中:

my_array = numpy.array(list(gimme()))

>可以使两个相同的生成器,运行第一个找到总长度,初始化数组,然后再次通过生成器找到每个元素:

length = sum(1 for el in gimme())
my_array = numpy.empty(length)
for i, el in enumerate(gimme()): my_array[i] = el

1可能是你要找的。 2是空间效率低下,3是时间效率低下(你必须通过发电机两次)。

http://stackoverflow.com/questions/367565/how-do-i-build-a-numpy-array-from-a-generator

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:python – 如何从一个生成器构建numpy数组?