【发布时间】:2012-10-04 23:13:54
【问题描述】:
假设我有一个表达式,我需要对其求和:
边界是有限且已知的。在 scipy/numpy 中计算这样一个总和的最快或最有效的方法是什么?可以使用嵌套的 for 循环来完成,但有没有更好的方法?
【问题讨论】:
标签: arrays numpy sum scipy nested-loops
假设我有一个表达式,我需要对其求和:
边界是有限且已知的。在 scipy/numpy 中计算这样一个总和的最快或最有效的方法是什么?可以使用嵌套的 for 循环来完成,但有没有更好的方法?
【问题讨论】:
标签: arrays numpy sum scipy nested-loops
怎么样
np.dot(x[:amax], np.cumsum(y[:amax] * np.sum(z[cmin:cmax])))
【讨论】:
np.einsum 也可能是此类总和的一种选择。正如 nevsan 所示,对于以a 为界的b,您需要首先使用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) 慢)。但是,如果您有更多的数组需要求和,这可能是一个不错的选择。
【讨论】: