np.sum和np.add.reduce - 在制作中,你用的是什么?

时间:2018-01-30 07:05:30

标签: python numpy

作为背景,请阅读此快速文章并明确答案: 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?如果是这样,为什么?

欢迎任何关于代码即兴创作的评论。

1 个答案:

答案 0 :(得分:2)

我不认为我np.add.reducenp.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不具备prodnp.add.at的{​​{1}}。 (似乎我最近对此发表了评论)。

我怀疑您在SO答案中发现np.add.reduceatnp.add.reduceufunc更多使用。这些是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);
}