【问题标题】:summing element in a range for all element in an array对数组中所有元素的范围内的元素求和
【发布时间】:2019-05-14 20:48:12
【问题描述】:

我必须从一个数组中获取一个范围的总和。然而,数组范围需要从一个元素移动到另一个元素。例如,如果数组是1,2,3,4,5,6,并且如果每两个元素都需要添加,那么它应该添加1+2而不是2+3而不是3+4等等。

我尝试过但没有得到正确的方法。我确信有一种 Pythonic 方式可以做到这一点。

这是我尝试过的

data = np.arange(0,20,.3)
for i in range (0,len(data)):
    for j in range(i,len(data)):
        get_range = data[j:5]
        get_add = get_range.sum()
        print("sum:",get_add) 

我尝试在这里添加每 5 个元素。

【问题讨论】:

  • get_range = data[j:j+5] ?

标签: python arrays list data-structures


【解决方案1】:

您可以使用 list comprehension 来检索 chunks 列表。

l = [1,2,3,4,5,6]
n = 2
output = [sum(l[i:i + n]) for i in range(0, len(l) - n + 1, 1)]

输出

[3, 5, 7, 9, 11]

【讨论】:

  • 谢谢,我可以用伪代码exc它,但不能在python中
  • 你的意思是你不能为你的数据运行它?
  • 对于这个解决方案,range函数不应该是range(0, len(l) - n, n - 1)吗?
  • 我认为这个用例不需要 step 参数
【解决方案2】:

有一种 numpyic 方法可以做到这一点。如果您的输入数据足够大,则内存和 CPU 效率更高。

import numpy as np

# input array: [1, 2, 3, 4, 5, 6]
data = np.arange(1, 7)

# cumulative sum: [1, 3, 6, 10, 15, 21]
data_cumsum = np.cumsum(data)

# append zero to start: [0, 1, 3, 6, 10, 15, 21]
data_cumsum = np.hstack([0, data_cumsum])

# calculate moving sum
window = 2
moving_sum = data_cumsum[window:] - data_cumsum[:-window]

print(moving_sum)

输出:

[ 3  5  7  9 11]

【讨论】:

    【解决方案3】:

    稍作改动即可解决问题

    data = np.arange(0,10)
    
    for j in range(0,len(data)-1):
        get_range = data[j:j+2] #changed from j to j+2
        get_add = get_range.sum()
        print("sum:",get_add) 
    

    输出

    ('sum:', 1)
    ('sum:', 3)
    ('sum:', 5)
    ('sum:', 7)
    ('sum:', 9)
    ('sum:', 11)
    ('sum:', 13)
    ('sum:', 15)
    ('sum:', 17)
    

    您可以轻松地压缩上述步骤以形成一个列表推导式,以相同的复杂性给出相同的结果

    [sum(data[j:j+2]) for j in range(0,len(data)-1)]
    

    另一种奇特的方法可能是使用sliding_window 函数

    from toolz.itertoolz import sliding_window
    map(sum,list(sliding_window(2,list(range(0,10)))))
    

    输出

    [1, 3, 5, 7, 9, 11, 13, 15, 17]
    

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多