【发布时间】:2010-09-26 22:09:49
【问题描述】:
如何从生成器对象构建一个 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())),但我不想支付同时在内存中拥有中间列表和最终数组的内存开销。有没有更节省空间的方法?
【问题讨论】:
-
这是一个有趣的问题。我通过
from numpy import *; print any(False for i in range(1))遇到了这个问题 - 它遮住了内置的any()并产生了相反的结果(据我所知)。 -
@moooeeeep 这太糟糕了。如果
numpy不能(或不想)像 Python 那样对待生成器,至少它应该在接收到生成器作为参数时引发异常。 -
@max 我踩到了完全相同的地雷。显然这是由on the NumPy list(和earlier)提出的,结论是这不会被更改为引发异常,并且应该始终使用命名空间。