2

假设我有一个表达式,我需要找到它的总和:

在此处输入图像描述

其中边界是有限且已知的。在 scipy/numpy 中计算这样一个总和的最快或最有效的方法是什么?可以使用嵌套的 for 循环来完成,但有更好的方法吗?

4

2 回答 2

4

怎么样

np.dot(x[:amax], np.cumsum(y[:amax] * np.sum(z[cmin:cmax])))
于 2012-10-05T03:42:17.040 回答
2

np.einsum对于这类总和,也可能是一种选择。正如 nevsan 所展示的那样,ba需要首先使用它np.cumsum,并且np.einsum在给定的示例中不应该更快。

它可能看起来像这样:

 y_acc = np.add.accumulate(y[:amax]) # same as cumsum
 result = np.einsum('i,i,j->', x[:amax], y_acc, z[cmin:cmax])

然而,这非常慢,因为 einsum 并没有优化z求和只需要进行一次的事实,因此您需要手动重新制定它:

result = np.einsum('i,i->', x[:amax], y_summed) * z[cmin:cmax].sum()

然而,在这种情况下应该比基于 nevsan 的np.dot方法慢,因为dot通常应该得到更好的优化(即np.einsum(ii->, a, b)比 慢np.dot(a, b))。但是,如果您有更多的数组要总结,这可能是一个不错的选择。

于 2012-10-07T14:14:27.053 回答