作为背景,请阅读此快速文章并明确答案: What is the difference between np.sum and np.add.reduce?
因此,对于小数组,使用add.reduce
的速度更快。让我们使用以下代码进行学习,该实验用于学习,它总结了一个2D数组:
a = np.array([[1,4,6],[3,1,2]])
print('Sum function result =', np.sum(a))
# faster for small array -
# print(np.add.reduce(a))
# but the only reduces dimension by 1. So do this repeatedly. I create a copy of x since I keep reducing it:
x = np.copy(a)
while x.size > 1:
x = np.add.reduce(x)
print('Sum with add.reduce =', x)
所以,上面的内容似乎有点矫枉过正 - 当你不知道阵列的大小时,我认为只使用sum
会更好,而且如果它更多的话比一个维度。如果您的阵列不明显/小,是否有人在生产代码中使用add.reduce
?如果是这样,为什么?
欢迎任何关于代码即兴创作的评论。
答案 0 :(得分:2)
我不认为我np.add.reduce
或np.sum
也会arr.sum
使用In [299]: arr = np.arange(10000).reshape(100,10,5,2)
In [300]: timeit np.sum(arr,axis=0).shape
20.1 µs ± 547 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [301]: timeit arr.sum(axis=0).shape
17.6 µs ± 22.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [302]: timeit np.add.reduce(arr,axis=0).shape
18 µs ± 300 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [303]:
。为什么要为一个微不足道的加速输入更长的东西。
在适度大小的数组上考虑1轴和:
arr.sum
np.sum
最快。显然它胜过np.add.reduce
,因为有一个较少级别的函数调用。 ufunc.reduce
并不快。
ufunc
占有一席之地,特别是对于sum
不具备prod
或np.add.at
的{{1}}。 (似乎我最近对此发表了评论)。
我怀疑您在SO答案中发现np.add.reduceat
或np.add.reduce
比ufunc
更多使用。这些是keepdims
构造,没有等效的方法。
或者搜索sum
之类的关键字。这可用于所有3种结构,但几乎所有示例都将使用reduce
,而不是In [307]: np.add.reduce(arr).shape # default axis 0
Out[307]: (10, 5, 2)
In [308]: np.sum(arr) # default axis None
Out[308]: 49995000
In [309]: arr.sum()
Out[309]: 49995000
。
当我设置这些测试时,我偶然发现了一些我不知道的差异:
function IsIE8Browser() {
var rv = -1;
var ua = navigator.userAgent;
var re = new RegExp("Trident\/([0-9]{1,}[\.0-9]{0,})");
if (re.exec(ua) != null) {
rv = parseFloat(RegExp.$1);
}
return (rv == 4);
}