Calling np.sum(np.fromiter(generator))



我有一个返回 numpy 数组的生成器。 例如,清酒,让它成为:

import numpy as np
a = np.arange(9).reshape(3,3)
gen = (x for x in a)

叫:

np.sum(gen)

numpy 1.17.4上:

弃用警告:不推荐调用 np.sum(generator),并且在 未来将给出不同的结果。用 np.sum(np.fromiter(generator)) 或内置的 Python Sum。

尝试重构上述内容:

np.sum(np.fromiter(gen, dtype=np.ndarray))

我得到:

值错误:无法从迭代器创建对象数组

上述陈述有什么问题?

问题是第二个参数,np.ndarrayfromiter()中。Numpy fromiter 期望一个 1D 并返回一个 1D 数组:

从可迭代对象创建新的一维数组。

因此,不能从迭代器创建对象数组。此外,由于我在第一行中所说的,.reshape()也会引发错误。总而言之,这有效:

import numpy as np
a = np.arange(9)
gen = (x for x in a)
print(np.sum(np.fromiter(gen,float)))

输出:

36

由于您要对数组的实例求和,因此您可以使用内置sum

result = sum(gen)

简单地将生成器转换为列表然后将其传递给np.sum怎么样?

a = np.arange(9).reshape(3,3)
gen = (x for x in a)

将所有元素相加:

>>> np.sum(list(gen))
36

按列求和:

>>> np.sum(list(gen), axis=0)
array([ 9, 12, 15])

逐行求和:

>>> np.sum(list(gen), axis=1)
array([ 3, 12, 21])

最新更新