python - Find all local Maxima and Minima when x and y values are given as numpy arrays -
i have 2 arrays x
, y
:
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 finding index of local minima , maxima follows:
sortid = np.argsort(x) x = x[sortid] y = y[sortid] minm = np.array([]) maxm = np.array([]) while < y.size-1: while(y[i+1] >= y[i]): = + 1 maxm = np.insert(maxm, 0, i) i++ while(y[i+1] <= y[i]): = + 1 minm = np.insert(minm, 0, i) i++
what problem in code? answer should index of minima = [2, 5, 7]
, of maxima = [1, 3, 6]
.
you not need while
loop @ all. code below give output want; finds local minima , local maxima , stores them in minm
, maxm
, respectively. please note: when apply large datasets, make sure smooth signals first; otherwise end tons of extrema.
import numpy np scipy.signal import argrelextrema import matplotlib.pyplot plt x = np.array([6, 3, 5, 2, 1, 4, 9, 7, 8]) y = np.array([2, 1, 3 ,5 ,3 ,9 ,8, 10, 7]) # sort data in x , rearrange y accordingly sortid = np.argsort(x) x = x[sortid] y = y[sortid] # way x-axis corresponds index of x plt.plot(x-1, y) plt.show() maxm = argrelextrema(y, np.greater) # (array([1, 3, 6]),) minm = argrelextrema(y, np.less) # (array([2, 5, 7]),)
this should far more efficient above while
loop.
the plot looks this; shifted x-values correspond returned indices in minm
, maxm
):
Comments
Post a Comment