生成器传递给" numpy.array"?这是一个错误吗?

时间:2017-03-29 20:56:46

标签: python arrays numpy generator

如果生成器传递给numpy.arraynumpy不会迭代对象,也不会抱怨,即使copy=True 。任何索引到数组的尝试都会失败,通常是在很晚以后和远程代码中。

我知道numpy想从一开始就知道数组的大小,但这种行为并不好。它应该复制到中间列表或引发异常。

2 个答案:

答案 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