从生成器快速创建nD数组,生成numpy数组?

sq1bmfud  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(73)

我有一个生成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(...))结构,因为我将调用它数十万次,延迟最终会增加,并在执行时间上产生很大的差异。

sy5wg1nm

sy5wg1nm1#

如何使用itertools.islice

from itertools import islice
g = generator()
arr = np.array(list(islice(g, 3)))

# or in one line:
# arr = np.array(list(islice(generator(), 3

产出:

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]])
suzh9iv8

suzh9iv82#

截至今天,这个问题已在大多数最新的NumPy版本中得到修复。因此,这现在起作用:

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)

但是,您将得到一个数组对象的数组,而不是一个排序矩阵。为了解决这个问题,您可以简单地更改最后一行:

arr = np.vstack(np.fromiter(iter(generator()), dtype=np.ndarray, count=3))

print(arr.shape)
# prints (3, 10)

相关问题