I have two arrays x
and y
as :
x = np.array([6, 3, 5, 2, 1, 4, 9, 7, 8])
y = np.array([2, 1, 3, 5, 3, 9, 8, 10, 7])
I am finding index of local minima and maxima as follows:
sortId = np.argsort(x)
x = x[sortId]
y = y[sortId]
minm = np.array([])
maxm = np.array([])
while i < y.size-1:
while(y[i+1] >= y[i]):
i = i + 1
maxm = np.insert(maxm, 0, i)
i++
while(y[i+1] <= y[i]):
i = i + 1
minm = np.insert(minm, 0, i)
i++
What is the problem in this code?
The answer should be index of minima = [2, 5, 7]
and that of maxima = [1, 3, 6]
.
You do not need this
while
loop at all. The code below will give you the output you want; it finds all local minima and all local maxima and stores them inminm
andmaxm
, respectively. Please note: When you apply this to large datasets, make sure to smooth the signals first; otherwise you will end up with tons of extrema.This should be far more efficient than the above
while
loop.The plot looks like this; I shifted the x-values so that they correspond to the returned indices in
minm
andmaxm
):As of SciPy version 1.1, you can also use find_peaks:
That yields
The nice thing is, that you can now also easily also set a minimum peak height (e.g. 8):
Note that now the first peak is excluded as its height is below 8.
Furthermore, you can set also the minimal distance between peaks (e.g. 5):
Now the middle peak is excluded as its distance to the other two peaks is less than 5.