我必须从数组中获取一个范围的总和。但是,数组范围需要从一个元素移到另一个。例如,如果数组是1,2,3,4,5,6
,并且每两个元素都需要添加,那么它应该比1+2
比2+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个元素。
答案 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]