我不认为我用过np.add.reduce
when np.sum
or arr.sum
也可以。为什么要为了一点点加速而输入更长的内容呢?
考虑适度大小的数组上的 1 轴总和:
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]:
arr.sum
是最快的。显然它胜过np.sum
因为少了一层函数调用。np.add.reduce
并没有更快。
The ufunc.reduce
有它的一席之地,特别是对于ufunc
没有相当于sum
or prod
。 (好像我最近对此发表了评论)。
我怀疑你会发现更多用途np.add.at
or np.add.reduceat
than np.add.reduce
在这样的答案中。那些是ufunc
没有等效方法的构造。
或者搜索类似的关键字keepdims
。这对于所有 3 个结构都可用,但几乎所有示例都将使用它sum
, not 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