[Numpy-discussion] Find groups of true values or sequence of values

Anne Archibald peridot.faceted at gmail.com
Thu Jun 19 23:42:08 EDT 2008


2008/6/18 bevan <bevan07 at gmail.com>:
> Hello,
>
> I am looking for some pointers that will hopefully get me a round an issue I
> have hit.
>
> I have a timeseries of river flow and would like to carry out some analysis on
> the recession periods.  That is anytime the values are decreasing.  I would
> like to restrict (mask) my data to any values that are in a continuous sequence
> of 3 or more (in the example below), that are decreasing in value.
>
> Hopefully this example helps:
>
> import numpy as np
>
> Flow = np.array([15.4,20.5,19.4,18.7,18.6,35.5,34.8,25.1,26.7])
> FlowDiff = np.diff(Flow)
> boolFlowdiff = FlowDiff>0
> MaskFlow = np.ma.masked_array(Flow[1:],boolFlowdiff)
>
> print MaskFlow
> [-- 19.4 18.7 18.6 -- 34.8 25.1 --]
>
> The output I would like is
> [-- 19.4 18.7 18.6 -- -- -- --]
> Where the second groups is blanked because the sequence only has 2 members.

I would tackle this in steps: find the decreasing pairs, then find
places where two of them occur in a row, then construct your mask.

Finding decreases:
d = diff(X)<0
finding two decreases in a row:
t = d[1:] & d[:-1]
creating the right mask:
m = np.zeros(n,dtype=np.bool)
m[:n-2] |= t
m[1:n-1] |= t
m[2:n] |= t

For finding longer runs you would want other tricks.

Anne



More information about the NumPy-Discussion mailing list