考虑一些给定的序列和一个窗口长度,比如list
a = [13 * i + 1 for i in range(24)]
(所以
^{pr2}$)
窗长3。在
我想取这个序列的滑动窗口和,但是是循环的;也就是说,计算长度-24list
:
[sum([1, 14, 27]),
sum([14, 27, 40]),
...,
sum([287, 300, 1]),
sum([300, 1, 14])]
使用^{
d = collections.deque(range(24))
d.rotate(1)
map(lambda _: d.rotate(-1) or sum(a[i] for i in list(d)[: 3]), range(24))
有什么不那么可怕的吗?在
简单的呢
注意,如果窗口很大,有更好的方法来计算
O(n)
中的滑动窗口和(即,每个元素的时间不变,与窗口的大小无关)。在这个想法是做一个“扫描转换”,从一开始就用所有元素的总和替换每个元素(这需要一次通过)。在
然后,从x0到x1的元素之和用O(1)计算
^{pr2}$代码:
在每个连续的点上,加上新的(
a[i]
),减去旧的(a[i-3]
)。为了绕回来,你可以把范围串起来。在一种快速的方法(至少对于大尺寸的窗口):
类似,但使用
^{pr2}$itertools.accumulate
:或者像Shashank的,但是有负指数:
一个简短而基本的方法,同样使用负指数:
相关问题 更多 >
编程相关推荐