如果生成器传递给numpy.array
,numpy
不会迭代对象,也不会抱怨,即使copy=True
。任何索引到数组的尝试都会失败,通常是在很晚以后和远程代码中。
我知道numpy想从一开始就知道数组的大小,但这种行为并不好。它应该复制到中间列表或引发异常。
答案 0 :(得分:3)
这不是错误,而是正常行为。如果要从迭代器创建数组,请使用fromiter
:
>>> import numpy
>>> a = (i*i for i in range(7))
>>> numpy.array(a)
array(<generator object <genexpr> at 0x10dbc1b40>, dtype=object)
>>> numpy.fromiter(a, dtype=float)
array([ 0., 1., 4., 9., 16., 25., 36.])
答案 1 :(得分:1)
不,这是一个设计决定。如果您想传入生成器,则需要使用np.fromiter
:
>>> np.fromiter((i for i in range(10)), float)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
或在致电list
之前将其转换为np.array
:
>>> np.array(list(your_iterator))
这样做的一个原因是numpy需要多次迭代对象:一次确定结果数组的长度/ dytpe,一次插入项目。这对于只能迭代一次的生成器和迭代器来说并不好用。生成器的长度也可以是无限的(即itertools.count
)和/或使用&#34;太多的内存&#34;。
理由可能是:如果有人想使用生成器来创建一个数组,那么它会使用大量内存并且速度很慢 - 所以应该有意识地完成它:通过将其转换为列表或者使用np.fromiter
。