For a sample array of integers:
In [225]: arr = np.arange(90); x=rolling_sum_with_reset(arr,3)
In [226]: x
Out[226]:
array([ 0., 1., 3., 3., 7., 12., 6., 13., 21., 9., 19.,
30., 12., 25., 39., 15., 31., 48., 18., 37., 57., 21.,
43., 66., 24., 49., 75., 27., 55., 84., 30., 61., 93.,
33., 67., 102., 36., 73., 111., 39., 79., 120., 42., 85.,
129., 45., 91., 138., 48., 97., 147., 51., 103., 156., 54.,
109., 165., 57., 115., 174., 60., 121., 183., 63., 127., 192.,
66., 133., 201., 69., 139., 210., 72., 145., 219., 75., 151.,
228., 78., 157., 237., 81., 163., 246., 84., 169., 255., 87.,
175., 264.])
如果arr
的大小是windows
的倍数,则可以将其重新整形为2d数组,并将cumsum应用于每行:
In [227]: y = np.cumsum(arr.reshape(-1,3), axis=1).ravel()
与您的结果相符:
In [228]: np.allclose(x,y)
Out[228]: True
我认为cumsum
可以与某种'重置'步长数组一起使用,但这种整形方法更容易.
as_strided
可以用来创建窗口,但由于窗口中不需要重叠,结果与此reshape
相同:
In [230]: np.lib.stride_tricks.sliding_window_view(arr,3)[::3]
Out[230]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17],
...
尺寸10的windows
In [237]: rolling_sum_with_reset(arr,10)
Out[237]:
array([ 0., 1., 3., 6., 10., 15., 21., 28., 36., 45., 10.,
21., 33., 46., 60., 75., 91., 108., 126., 145., 20., 41.,
63., 86., 110., 135., 161., 188., 216., 245., 30., 61., 93.,
126., 160., 195., 231., 268., 306., 345., 40., 81., 123., 166.,
210., 255., 301., 348., 396., 445., 50., 101., 153., 206., 260.,
315., 371., 428., 486., 545., 60., 121., 183., 246., 310., 375.,
441., 508., 576., 645., 70., 141., 213., 286., 360., 435., 511.,
588., 666., 745., 80., 161., 243., 326., 410., 495., 581., 668.,
756., 845.])
In [238]: y = np.cumsum(arr.reshape(-1,10), axis=1).ravel()
In [239]: y
Out[239]:
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 10, 21, 33,
46, 60, 75, 91, 108, 126, 145, 20, 41, 63, 86, 110, 135,
161, 188, 216, 245, 30, 61, 93, 126, 160, 195, 231, 268, 306,
345, 40, 81, 123, 166, 210, 255, 301, 348, 396, 445, 50, 101,
153, 206, 260, 315, 371, 428, 486, 545, 60, 121, 183, 246, 310,
375, 441, 508, 576, 645, 70, 141, 213, 286, 360, 435, 511, 588,
666, 745, 80, 161, 243, 326, 410, 495, 581, 668, 756, 845])