[SciPy-Dev] Function for finding relative maxima of a 1d array

Jacob Silterra jsilter@gmail....
Tue Sep 20 12:25:03 CDT 2011

Hello all,

I posted an idea for a simple function for finding relative maxima of 1D
data in the numpy mailing list; the general consensus seemed to be that it
was useless but more advanced algorithm would be useful in scipy.  Since
this is an addition of new functionality, I thought (re: was told in the
case of numpy) it'd be best to discuss it over the mailing list before
issuing a pull request. Full code available at
https://github.com/jsilter/scipy/tree/find_peaks.  The method is named
find_peaks, located in optimize.py in the optimize module.

Copied from the docstring:
    The algorithm is as follows:
    1. Perform a continuous wavelet transform on `vector`, for the supplied
    `widths`. This is a convolution of `vector` with `wavelet(width)` for
    each width in `widths`. See scipy.signals.cwt (pending).
    2. Identify "ridge lines" in the cwt matrix. These are relative maxima
    at each row, connected across adjacent rows. See identify_ridge_lines
(in optimize.py)
    3. Filter the ridge_lines using filter_ridge_lines (in optimize.py) by
length and signal to noise ratio.

This algorithm requires several parameters be specified, I chose what I
thought were reasonable values to be defaults. This method was designed for
use in mass-spectrogram analysis, which typically have large,sharp peaks on
top of a flat and noisy baseline. With proper parameter selection, I believe
it would function well for a wide class of peaks. The default wavelet for
step 1 is a ricker
<http://en.wikipedia.org/wiki/Mexican_hat_wavelet>wavelet, which is
added in scipy.signal.wavelets.

This is implemented in pure python, which is appropriate for steps 1 and 3.
Step 2 involves a lot of looping, that may be better in C, but it's Python
at the moment.

I used my best judgement on placing functions in appropriate modules, which
led to some circular dependencies. As a temporary fix, the imports are
within each function rather than at the top of each module. Once it's
decided where each function should actually live that can be resolved.



PS There's a good comparison different algorithms available

PPS I have Eclipse configured to use PEP8 standards for spacing after
commas, assignment operators, and so forth. This ended up changing a lot of
code which may make this specific function hard to review (sorry). I put the
new functions close to the bottom of each file.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/scipy-dev/attachments/20110920/c79f0c78/attachment.html 

More information about the SciPy-Dev mailing list