2024-03-29 00:31:54 发布
网友
如果将生成器传递给numpy.array,numpy不会迭代对象,也不会抱怨,即使copy=True。任何对数组进行索引的尝试都会失败,通常是在很晚的时间内,而且是在遥远的代码中。你知道吗
numpy.array
numpy
copy=True
我知道numpy希望从一开始就知道数组的大小,但是这种行为并不好。它要么复制到中间列表,要么引发异常。你知道吗
这不是bug,而是正常行为。如果要从迭代器创建数组,请使用fromiter:
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
>>> np.array(list(your_iterator))
其中一个原因是numpy需要在对象上迭代几次:一次确定结果数组的长度/dytpe,一次插入项。对于只能迭代一次的生成器和迭代器来说,这并不能很好地发挥作用。此外,生成器的长度可以是无限的(即itertools.count)和/或使用“太多内存”。你知道吗
itertools.count
其基本原理可能是:如果有人想使用生成器创建一个数组,那么它将占用大量内存,而且速度很慢——因此应该有意地这样做:要么将其强制转换为一个列表,要么使用np.fromiter。你知道吗
np.fromiter
这不是bug,而是正常行为。如果要从迭代器创建数组,请使用
fromiter
:不,这是设计决定。如果要传入生成器,则需要使用^{} :
或者在调用
np.array
之前将其转换为list
:其中一个原因是numpy需要在对象上迭代几次:一次确定结果数组的长度/dytpe,一次插入项。对于只能迭代一次的生成器和迭代器来说,这并不能很好地发挥作用。此外,生成器的长度可以是无限的(即
itertools.count
)和/或使用“太多内存”。你知道吗其基本原理可能是:如果有人想使用生成器创建一个数组,那么它将占用大量内存,而且速度很慢——因此应该有意地这样做:要么将其强制转换为一个列表,要么使用
np.fromiter
。你知道吗相关问题 更多 >
编程相关推荐