Мы можем сделать это за два прохода np.cumsum(..)
.Сначала мы вычисляем cumsum
массива:
a = np.array([0,0,0,0,1,1,1,0,0,1,1,0])
c = np.cumsum(a)
Это дает нам:
>>> c
array([0, 0, 0, 0, 1, 2, 3, 3, 3, 4, 5, 5])
Затем мы фильтруем a
по элементам, значение которых равно 0
, и мыпоэлементно вычислите разницу между этим элементом и его предшественником:
corr = np.diff(np.hstack(((0,), c[a == 0])))
, тогда это исправление, которое мы должны применить к этим элементам:
>>> corr
array([0, 0, 0, 0, 3, 0, 2])
Затем мы можем сделать копию a
(или сделайте это на месте) и вычтите исправление:
a2 = a.copy()
a2[a == 0] -= corr
это даст нам:
>>> a2
array([ 0, 0, 0, 0, 1, 1, 1, -3, 0, 1, 1, -2])
, и теперь мы можем вычислить кумулятивную сумму a2
, которая будетСброс на 0
для 0
, так как коррекция отслеживает приращения между:
>>> a2.cumsum()
array([0, 0, 0, 0, 1, 2, 3, 0, 0, 1, 2, 0])
или как функция:
import numpy as np
def cumsumreset(iterable, reset=0):
a = np.array(iterable)
c = a.cumsum()
a2 = a.copy()
filter = a == reset
a2[filter] -= np.diff(np.hstack(((0,), c[filter])))
return a2.cumsum()
, тогда это дает нам:
>>> cumsumreset([0,0,0,0,1,1,1,0,0,1,1,0])
array([0, 0, 0, 0, 1, 2, 3, 0, 0, 1, 2, 0])