# [Numpy-discussion] Is there a way to reset an accumulate function?

Cera, Tim tim at cerazone.net
Wed Oct 24 21:24:03 EDT 2012

```On Wed, Oct 24, 2012 at 4:47 AM, Robert Kern <robert.kern at gmail.com> wrote:

>
>
> def nancumsum(x):
>     nans = np.isnan(x)
>     x = np.array(x)
>     x[nans] = 0
>     reset_idx = np.zeros(len(x), dtype=int)
>     reset_idx[nans] = np.arange(len(x))[nans]
>     reset_idx = np.maximum.accumulate(reset_idx)
>     cumsum = np.cumsum(x)
>     cumsum = cumsum - cumsum[reset_idx]
>     return cumsum
>

Thank you for putting in the time to look at this.

It doesn't work for the first group of numbers if x[0] is non-zero.  Could
perhaps concatenate a np.nan at the beginning to force a reset and adjust
the returned array to not include the dummy value...

def nancumsum(x):
x = np.concatenate(([np.nan], x))
nans = np.isnan(x)
x = np.array(x)
x[nans] = 0
reset_idx = np.zeros(len(x), dtype=int)
reset_idx[nans] = np.arange(len(x))[nans]
reset_idx = np.maximum.accumulate(reset_idx)
cumsum = np.cumsum(x)
cumsum = cumsum - cumsum[reset_idx]
return cumsum[1:]

>>> a
array([  4.,   1.,   2.,   0.,  18.,   5.,   6.,   0.,   8.,   9.],
dtype=float32)

If no np.nan, then 'nancumsum' and 'np.cumsum' should be the same...

>>> np.cumsum(a)
array([  4.,   5.,   7.,   7.,  25.,  30.,  36.,  36.,  44.,  53.],
dtype=float32)

>>> nancumsum(a)
array([  4.,   5.,   7.,   7.,  25.,  30.,  36.,  36.,  44.,  53.])

>>> a[3] = np.nan

>>> np.cumsum(a)
array([  4.,   5.,   7.,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
dtype=float32)

>>> nancumsum(a)
array([  4.,   5.,   7.,   0.,  18.,  23.,  29.,  29.,  37.,  46.])

Excellent!

Kindest regards,
Tim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20121024/8067d1fc/attachment.html>
```