31

np.sum和 和有什么不一样np.add.reduce
虽然文档非常明确:

例如,add.reduce() 等价于 sum()。

两者的性能似乎完全不同:对于相对较小的数组大小add.reduce大约快两倍。

$ python -mtimeit -s"import numpy as np; a = np.random.rand(100); summ=np.sum" "summ(a)"
100000 loops, best of 3: 2.11 usec per loop
$ python -mtimeit -s"import numpy as np; a = np.random.rand(100); summ=np.add.reduce" "summ(a)"
1000000 loops, best of 3: 0.81 usec per loop

$ python -mtimeit -s"import numpy as np; a = np.random.rand(1000); summ=np.sum" "summ(a)"
100000 loops, best of 3: 2.78 usec per loop
$ python -mtimeit -s"import numpy as np; a = np.random.rand(1000); summ=np.add.reduce" "summ(a)"
1000000 loops, best of 3: 1.5 usec per loop

对于更大的数组大小,差异似乎消失了:

$ python -mtimeit -s"import numpy as np; a = np.random.rand(10000); summ=np.sum" "summ(a)"
100000 loops, best of 3: 10.7 usec per loop
$ python -mtimeit -s"import numpy as np; a = np.random.rand(10000); summ=np.add.reduce" "summ(a)"
100000 loops, best of 3: 9.2 usec per loop
4

3 回答 3

30

简短的回答:当参数是一个 numpy 数组时,np.sum最终调用add.reduce来完成这项工作。处理其参数和调度到的开销add.reduce是为什么np.sum较慢。

更长的答案: np.sum定义在numpy/core/fromnumeric.py. 在 的定义中np.sum,您会看到工作被传递给_methods._sum. 中的那个函数_methods.py很简单:

def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
    return um.add.reduce(a, axis=axis, dtype=dtype,
                            out=out, keepdims=keepdims)

umadd是定义 ufunc的模块。

于 2013-05-07T14:13:01.637 回答
16

如果你盲目地从一个重构到另一个,实际上有一个差异可能会咬到你:

>>> import numpy as np
>>> a = np.arange(4).reshape(2, 2)
>>> 
>>> np.sum(a)
6
>>> np.add.reduce(a)
array([2, 4])
>>> 

默认axis值不同!

于 2018-01-30T07:37:24.497 回答
0

要回答标题中的问题,简单地说:使用矩阵时,您会发现这两个函数之间有一个重要区别:

np.sum(不指定轴)将返回矩阵中所有元素的总和。

np.add.reduce(不指定轴)将沿轴 = 0 返回总和。即 add.reduce(a) 等价于 sum(a, axis=0)

但是,如果您指定轴,两者都将返回相同的值。我发布答案是因为我没有足够的代表发表评论。

于 2021-07-09T08:11:54.457 回答