这是一个错误,发电机不工作时,传递给“numpy.数组"?

2024-03-29 00:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

如果将生成器传递给numpy.arraynumpy不会迭代对象,也不会抱怨,即使copy=True。任何对数组进行索引的尝试都会失败,通常是在很晚的时间内,而且是在遥远的代码中。你知道吗

我知道numpy希望从一开始就知道数组的大小,但是这种行为并不好。它要么复制到中间列表,要么引发异常。你知道吗


Tags: 对象代码numpytrue列表时间数组array
2条回答

这不是bug,而是正常行为。如果要从迭代器创建数组,请使用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.])

不,这是设计决定。如果要传入生成器,则需要使用^{}

>>> np.fromiter((i for i in range(10)), float)
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])

或者在调用np.array之前将其转换为list

>>> np.array(list(your_iterator))

其中一个原因是numpy需要在对象上迭代几次:一次确定结果数组的长度/dytpe,一次插入项。对于只能迭代一次的生成器和迭代器来说,这并不能很好地发挥作用。此外,生成器的长度可以是无限的(即itertools.count)和/或使用“太多内存”。你知道吗

其基本原理可能是:如果有人想使用生成器创建一个数组,那么它将占用大量内存,而且速度很慢——因此应该有意地这样做:要么将其强制转换为一个列表,要么使用np.fromiter。你知道吗

相关问题 更多 >