如何在移动范围内总结列表中的元素
How to sum up elements in list in a moving range
我试图在移动范围内对列表中的元素求和。例如,当用户输入一个自定义范围'n'时,list[0]到list[n]会被累加存储在一个新的list中,接着是list[1]到list[n+1],直到结束。最后将打印出新列表中的最大数量。但是,在我的代码中,似乎元素是不断累加的。
非常感谢您的帮助。
列表是:
[5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2]
我的代码:
days = int(input('Enter customized range: '))
n = np.arange(days)
total = 0
count = 1
max_total = []
while (count + len(n) - 2) <= (len(rain_b) - 1):
for i in range(count+len(n)-4, count+len(n)-2):
total += rain_c[i]
#print(rain_b[count+number-1])
#total = sum([(rain_c(count+number-4)) : (count+number-2)])
max_total.append(total)
count += 1
print(max_total)
试试这个(lst
是你的列表,n
是你的范围):
print(max(sum(lst[i:i+n+1]) for i in range(len(lst)-n)))
例如:
>>> lst = [5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4]
>>> n = 5
>>> print([sum(lst[i:i+n+1]) for i in range(len(lst)-n)])
[21.5, 21.7, 38.9]
>>> print(max(sum(lst[i:i+n+1]) for i in range(len(lst)-n)))
38.9
由于您已经在使用 numpy,因此您可以将 np.convolve()
与长度为 n
:
的数组一起使用
>>> n = 5
>>> x = np.arange(10)
>>> np.max(np.convolve(x, np.ones(n, dtype=x.dtype), mode="valid"))
35
这具有对数组 x
的每个 n
元素“window”执行 np.ones(n)
的点积的效果。 numpy.lib.stride_tricks
中的 sliding_window_view()
是类似的,有助于解释:
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> windows = np.lib.stride_tricks.sliding_window_view(x, n)
>>> windows
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8],
[5, 6, 7, 8, 9]])
>>> windows.sum(axis=1)
array([10, 15, 20, 25, 30, 35])
>>> np.convolve(x, np.ones(n, dtype=x.dtype), mode="valid")
array([10, 15, 20, 25, 30, 35])
我会清理您的循环条件,使其更加清晰和惯用。
我认为问题在于您没有将迭代之间的 总数 归零。
什么是rain_b和rain_c?应该只有 1 个输入列表和 1 个输出列表。
为什么不将 n 存储为整数而不是某个对象?我的电脑上没有 numpy,所以我只是删除了那部分。
这是我将如何执行此操作的伪代码:
For x in range 0 up to len(input_list) - n:
window_total = 0
for y in range x to x+n-1:
window_total += input_list[y]
output_list.append(window_total)
基于一个包含数字累加和的iterator/array,你可以通过减去后面n位的累加值得到n个值的滚动和。这种方法具有 O(N) 时间复杂度(与计算每个子范围的总和相反,即 O(N x W),其中 W 是滚动 window 大小)
没有 numpy:
L = [5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2]
n = 3
from itertools import accumulate
S = (a-b for a,b in zip(accumulate(L),accumulate([0]*n+L)))
print(max(S)) # 188.8
使用 numpy
import numpy as np
L = np.array([5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2])
n = 3
S = np.cumsum(L)
S[n:] -= S[:-n]
print(np.max(S)) # 188.8
我试图在移动范围内对列表中的元素求和。例如,当用户输入一个自定义范围'n'时,list[0]到list[n]会被累加存储在一个新的list中,接着是list[1]到list[n+1],直到结束。最后将打印出新列表中的最大数量。但是,在我的代码中,似乎元素是不断累加的。 非常感谢您的帮助。
列表是:
[5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2]
我的代码:
days = int(input('Enter customized range: '))
n = np.arange(days)
total = 0
count = 1
max_total = []
while (count + len(n) - 2) <= (len(rain_b) - 1):
for i in range(count+len(n)-4, count+len(n)-2):
total += rain_c[i]
#print(rain_b[count+number-1])
#total = sum([(rain_c(count+number-4)) : (count+number-2)])
max_total.append(total)
count += 1
print(max_total)
试试这个(lst
是你的列表,n
是你的范围):
print(max(sum(lst[i:i+n+1]) for i in range(len(lst)-n)))
例如:
>>> lst = [5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4]
>>> n = 5
>>> print([sum(lst[i:i+n+1]) for i in range(len(lst)-n)])
[21.5, 21.7, 38.9]
>>> print(max(sum(lst[i:i+n+1]) for i in range(len(lst)-n)))
38.9
由于您已经在使用 numpy,因此您可以将 np.convolve()
与长度为 n
:
>>> n = 5
>>> x = np.arange(10)
>>> np.max(np.convolve(x, np.ones(n, dtype=x.dtype), mode="valid"))
35
这具有对数组 x
的每个 n
元素“window”执行 np.ones(n)
的点积的效果。 numpy.lib.stride_tricks
中的 sliding_window_view()
是类似的,有助于解释:
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> windows = np.lib.stride_tricks.sliding_window_view(x, n)
>>> windows
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8],
[5, 6, 7, 8, 9]])
>>> windows.sum(axis=1)
array([10, 15, 20, 25, 30, 35])
>>> np.convolve(x, np.ones(n, dtype=x.dtype), mode="valid")
array([10, 15, 20, 25, 30, 35])
我会清理您的循环条件,使其更加清晰和惯用。
我认为问题在于您没有将迭代之间的 总数 归零。
什么是rain_b和rain_c?应该只有 1 个输入列表和 1 个输出列表。
为什么不将 n 存储为整数而不是某个对象?我的电脑上没有 numpy,所以我只是删除了那部分。
这是我将如何执行此操作的伪代码:
For x in range 0 up to len(input_list) - n:
window_total = 0
for y in range x to x+n-1:
window_total += input_list[y]
output_list.append(window_total)
基于一个包含数字累加和的iterator/array,你可以通过减去后面n位的累加值得到n个值的滚动和。这种方法具有 O(N) 时间复杂度(与计算每个子范围的总和相反,即 O(N x W),其中 W 是滚动 window 大小)
没有 numpy:
L = [5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2]
n = 3
from itertools import accumulate
S = (a-b for a,b in zip(accumulate(L),accumulate([0]*n+L)))
print(max(S)) # 188.8
使用 numpy
import numpy as np
L = np.array([5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2])
n = 3
S = np.cumsum(L)
S[n:] -= S[:-n]
print(np.max(S)) # 188.8