[英]Get Peaks in Plot Python
我有以下數據:
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()
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()
有道格拉斯-普克算法,見https://stackoverflow.com/a/49377181/562769
這個想法是簡化那條線,直到只剩下最相關的點。 然后,您將每個點都取超過閾值(例如,高於平均值),然后您就會得到峰值。
依稀記得scipy信號處理有更復雜的方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.