[Numpy-discussion] Functions for finding the relative extrema of numeric data

Samuel John scipy@samueljohn...
Thu Sep 15 10:41:51 CDT 2011


Hi all,

I am not sure if this is of help for anyone. I wrote some code to find the relative maxima in a 1D array for my own purpose.
Maybe someone is interested or even finds a bug *g*.
I post the code here and appreciate any feedback. Even "stop spamming your buggy code" :-)


> from numpy import diff, sign, convolve, array, where, around, int32, alen
> 
> def localmaxima_at(x):
>     '''Returns the indices of local maxima in the 1D array x.
>     
>     If several elements in x have the same value, then the 
>     index of the element in the middle is returned.
>     
>     If there are two adjacent elements with the same value,
>     one of them is returned.
>     
>     x[0] and x[-1] are never returned as an index for the
>     local maximum.
>     
>     @Author: Samuel John
>     @copyright: http://creativecommons.org/licenses/by-nc-sa/3.0/
>     @todo: unittests
>     '''
>     assert len(x) > 2, "Length of x should be greater than two in order to define a meaningful local maximum."
>     assert x.ndim == 1, "Expected 1D array."
>     #print 'x=\n',x
>     filled=sign(diff(x)).astype(int32)
>     # fill zeros:
>     has_zeros = (filled == 0).any()
>     last = 0
>     if has_zeros:
>         for i in xrange(alen(filled)):
>             if filled[i] == 0:
>                 filled[i] = last
>             else:
>                 last = filled[i]
>     #print 'filled\n',filled
>     left = where( convolve(
>                       filled,
>                       array([-1,1]), mode='full' ) -2 == 0 )[0]
> 
>     if has_zeros:
>         filled=sign(diff(x)).astype(int32)
>         last = 0
>         for i in reversed(xrange(len(filled))):
>             if filled[i] == 0:
>                 filled[i] = last
>             else:
>                 last = filled[i]
> 
>     right = where( convolve(
>                       filled,
>                       array([-1,1]), mode='full' ) -2 == 0 )[0]
>     #print 'left\n',left
>     #print 'right\n',right
>     return around( (left + right) / 2.0).astype(int32)
> 



bests,
 Samuel


More information about the NumPy-Discussion mailing list