我有以下数据:
data = np.array([ 0., 0., 0., 94., 30., 30., 30., 31., 29., 30., 29., 28., 26.,
29., 28., 29., 31., 32., 31., 29., 31., 31., 30., 34., 28., 31.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 54., 9., 9., 7., 7.,
14., 18., 13., 8., 2., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0.])
如果我绘制它,它看起来像这样:
现在,我想自动识别红色的点。 知道我该怎么做吗?
编辑:
尝试过scipy.signal
,但至少在默认配置下,它无法正确检测峰:
from matplotlib import pyplot as plt
from scipy.signal import find_peaks
peaks, _ = find_peaks(data, height=20)
plt.plot(data)
plt.plot(peaks, data[peaks], "x")
plt.show()
答案 0 :(得分:1)
scipy.signal
有效(至少大多数情况下),只要您对其进行适当的平滑处理。您还可以使用小波变换(find_peaks_cwt
),该技术可以使用小波平滑化,因此对于嘈杂的数据,效果要比find_peaks
稍好
from matplotlib import pyplot as plt
from scipy.signal import find_peaks_cwt
peaks = find_peaks_cwt(data, widths=np.ones(data.shape)*2)-1
plt.plot(data)
plt.plot(peaks, data[peaks], "x")
plt.show()
答案 1 :(得分:0)
有Douglas-Peucker算法,请参见https://stackoverflow.com/a/49377181/562769
这个想法是简化那条线,直到您只剩下最相关的点。然后,您将高于阈值(例如高于均值)的每个点都作为峰值。
我隐约记得,科学信号处理具有更复杂的方法