对数组中所有元素的范围内的元素求和

时间:2018-12-13 15:32:05

标签: python arrays data-structures

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

我尝试过但未找到正确的方法。我敢肯定,有一种Python方式可以做到这一点。

这是我尝试过的

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个元素。

3 个答案:

答案 0 :(得分:3)

您可以使用列表理解来检索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]

答案 1 :(得分:2)

有一种麻木的方法可以做到这一点。如果您输入的数据足够大,它将更加节省内存和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]

答案 2 :(得分:1)

稍作改动即可解决问题

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]