【问题标题】:Numpy: Sum of 1D array for index i < jNumpy:索引 i < j 的一维数组的总和
【发布时间】:2020-12-16 07:54:13
【问题描述】:

我试图弄清楚如何最有效地(使用 NumPy)计算一维 ndarray 的以下表达式(在本例中为 f):

我想我可以这样做:

f = [ 1, 3, 2, 3, 7, 5, 2]
for i in range(0, len(f-1)):
    for j in range(0, len(f-2)):
        ...

但这意味着如果我理解正确的话,我必须为列表中的每个元素设置一个条件循环。有没有更好的方法来做到这一点?

提前感谢您的任何提示!

【问题讨论】:

    标签: python arrays python-3.x list numpy


    【解决方案1】:

    您可以利用 numpy 广播:

    f = np.array([ 1, 3, 2, 3, 7, 5, 2])
    np.triu(f[:,None]-f).sum()
    

    或同样:

    np.tril(f-f[:,None]).sum()
    

    输出:

    -24
    

    【讨论】:

    • 这很方便地利用了排除位置中的值将为零并且不会影响总和这一事实。但是假设有一个通用操作不是这种情况。有没有一种方法可以有效地提取一维数组,其中包含(以某种顺序)f[i]-f[j] 的值,仅针对 i,j 的值,其中 i&lt;j 的值(即本例中的长度 21)?跨度>
    • @alani 有多种方法可以做到这一点。这是一个:(f[:,None]-f)[np.triu_indices(f.size,1)]
    • @alani 不客气 :) 请注意,我什至在选择中包括了对角线,因为在这种特定情况下对角线是 0。在一般情况下,您甚至可以使用以下任一参数选择偏移量这些功能。
    【解决方案2】:

    你可以试试这个

    f = [ 1, 2, 3, 4]
    combined = 0
    for i in range(0, len(f)):
        for j in range(i+1, len(f)):
            combined += f[i]-f[j]
    

    您使用 i 作为内部循环的起点。这样你就不需要 if 条件了。

    【讨论】:

      【解决方案3】:

      这不使用 Numpy,但如果您愿意,您可以简单地使用列表切片并执行类似的操作

      def partial_sum(lst,i, j):
          return sum(lst[i:j])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-06
        • 2012-10-20
        • 1970-01-01
        • 2019-04-19
        • 2020-03-25
        • 2023-04-05
        • 2021-09-05
        • 1970-01-01
        相关资源
        最近更新 更多