On Wed, Oct 24, 2012 at 4:47 AM, Robert Kern <robert.k...@gmail.com> wrote:
> How about this? > > > 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
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion