np.sum和np.add.reduce有什么区别?

时间:2013-05-07 13:17:05

标签: python numpy

np.sumnp.add.reduce之间的区别是什么? 虽然the docs非常明确:

  

例如,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

3 个答案:

答案 0 :(得分:21)

简短回答:当参数为numpy数组时,np.sum最终会调用add.reduce来完成工作。处理其参数并分派到add.reduce的开销是np.sum较慢的原因。

更长的回答: np.sum中定义了np.sum。在_methods._sum的定义中,你会 看到作品被传递给def _sum(a, axis=None, dtype=None, out=None, keepdims=False): return um.add.reduce(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims) numpy/core/fromnumeric.py中的这个功能很简单:

um

add是定义{{1}} ufunc的模块。

答案 1 :(得分:7)

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

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

axis默认值不同!

答案 2 :(得分:0)

要回答标题中的问题,只需:使用矩阵时, 您会发现这两个功能之间的重要区别:

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

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

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