我有一个返回 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.ndarray
在fromiter()
中。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])