我有一个生成NumPy数组的生成器,需要一种方法通过从生成器获取特定数量的产量,从生成器的结果(数组的数组)快速构建另一个NumPy数组。速度是我的问题的关键。我试过np.fromiter
,但它似乎不支持从数组构造:
import numpy as np
def generator():
for i in range(5):
yield np.array([i]*10)
arr = np.fromiter(iter(generator()), dtype=np.ndarray, count=3)
这会抛出一个错误,如其他几篇SO文章所述:
Calling np.sum(np.fromiter(generator))
Numpy ValueError: setting an array element with a sequence
然而,我还没有找到任何答案,可以提供一种快速的方法来从生成器中获取数组,而不必这样做:
it = iter(generator())
arr = np.array([next(it) for _ in range(3)])
这里确实表明np.fromiter
要快得多:Faster way to convert list of objects to numpy array
有没有可能从生成器中快速获取numpy数组,而不使用慢速列表到数组转换?我特别想避免使用np.array(list(...))
结构,因为我将调用它数十万次,延迟最终会增加,并在执行时间上产生很大的差异。
2条答案
按热度按时间sy5wg1nm1#
如何使用
itertools.islice
?产出:
suzh9iv82#
截至今天,这个问题已在大多数最新的NumPy版本中得到修复。因此,这现在起作用:
但是,您将得到一个数组对象的数组,而不是一个排序矩阵。为了解决这个问题,您可以简单地更改最后一行: