Python 找到最接近峰值的最小值

Python 找到最接近峰值的最小值,python,scipy,signal-processing,Python,Scipy,Signal Processing,我使用以下方法查找峰值和最小值: import numpy as np from scipy.signal import find_peaks x=np.array([9.8,57.,53.,37.,24.,19.,16.,15.,13.,13.,12.,12.,11.,11.,11.,11.,11.,11.,10.,13.,13.,13.,15.,13.,12.,14.,15.,14.,51.,34.,24.,20.,24.,22.,18.,57.,63.,38.,27.,28.,31.,3

我使用以下方法查找峰值和最小值:

import numpy as np
from scipy.signal import find_peaks

x=np.array([9.8,57.,53.,37.,24.,19.,16.,15.,13.,13.,12.,12.,11.,11.,11.,11.,11.,11.,10.,13.,13.,13.,15.,13.,12.,14.,15.,14.,51.,34.,24.,20.,24.,22.,18.,57.,63.,38.,27.,28.,31.,33.,94.,71.,48.,40.,43.,39.,31.,27.,22.,21.,20.,19.,18.,18.,19.,20.,20.,49.,62.,48.,43.,34.,33.,28.,26.,26.,24.,23.,23.,26.,27.,70.,97.,57.,46.,68.,82.,59.,49.,37.,40.,45.,36.,33.,28.,22.,23.,284.,524.,169.,111.,148.,98.,68.,50.,38.,30.,28.])
peaks, _ = find_peaks(x)
mins, _ =find_peaks(x*-1)
这看起来像:

现在我感兴趣的是找到离每个峰值最近的最小值。所以我可以把它们区别开来

在浏览了
find\u peaks
文档之后,这个参数似乎就是我要寻找的

prominences = peak_prominences(x, peaks)[0]
contour_heights = x[peaks] - prominences
这看起来像:

检查后,
峰值突出物
发现峰值之前的最小值。对于我的应用程序,我需要最接近的峰值,不管它是在前面还是后面

如何使用
mins
峰值突出度计算定义参数
wlen

既然
mins
由最小值的索引组成,我如何使用它来定义
wlen
?基本上,我必须以min为单位找到每个峰值的指数(即
峰值[I]

只有使用
mins
peaks
,是否有更好的方法来实现这一点

现在我感兴趣的是找到离每个峰值最近的最小值。所以我可以把它们区别开来

以下是您想要的吗

closest_mins = [mins[np.argmin(np.abs(x-mins))] for x in peaks]
difference = x[peaks]-x[closest_mins]
print(difference)
下面是用虚线表示的
峰值
分钟
,和
峰值
-最近的
分钟
对的曲线图。请注意,有
分钟
最接近多个
峰值

plt.plot(x)
plt.plot(peaks, x[peaks],'o', label = 'peaks')
plt.plot(mins, x[mins],'s', label = 'mins')
plt.plot(closest_mins, x[closest_mins],'*', label = 'closest mins')

for p, m in zip(peaks, closest_mins):
    plt.plot([p,m], [x[p], x[m]], 'k', dashes = (4,1))
plt.legend();

谢谢<代码>[mins[np.argmin(np.abs(x-mins))]对于峰值中的x]
正是我想要的。
plt.plot(x)
plt.plot(peaks, x[peaks],'o', label = 'peaks')
plt.plot(mins, x[mins],'s', label = 'mins')
plt.plot(closest_mins, x[closest_mins],'*', label = 'closest mins')

for p, m in zip(peaks, closest_mins):
    plt.plot([p,m], [x[p], x[m]], 'k', dashes = (4,1))
plt.legend();