【问题标题】:Scipy/Numpy: summation over multiple indicesScipy/Numpy:对多个索引求和
【发布时间】:2012-10-04 23:13:54
【问题描述】:

假设我有一个表达式,我需要对其求和:

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

【问题讨论】:

    标签: arrays numpy sum scipy nested-loops


    【解决方案1】:

    怎么样

    np.dot(x[:amax], np.cumsum(y[:amax] * np.sum(z[cmin:cmax])))
    

    【讨论】:

      【解决方案2】:

      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) 慢)。但是,如果您有更多的数组需要求和,这可能是一个不错的选择。

      【讨论】:

        猜你喜欢
        • 2018-05-23
        • 2015-03-21
        • 2021-04-12
        • 2021-04-22
        • 2020-10-22
        • 2011-04-06
        • 2017-06-11
        • 2018-12-17
        • 2018-10-13
        相关资源
        最近更新 更多