[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