在Plot Python中获得峰值

时间:2019-02-28 06:29:31

标签: python python-3.x numpy

我有以下数据:

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.])

如果我绘制它,它看起来像这样:

enter image description here

现在,我想自动识别红色的点。 知道我该怎么做吗?

编辑: 尝试过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()

enter image description here

2 个答案:

答案 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()

enter image description here

答案 1 :(得分:0)

有Douglas-Peucker算法,请参见https://stackoverflow.com/a/49377181/562769

这个想法是简化那条线,直到您只剩下最相关的点。然后,您将高于阈值(例如高于均值)的每个点都作为峰值。

我隐约记得,科学信号处理具有更复杂的方法