python - 在 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()
解决方案
有道格拉斯-普克算法,见https://stackoverflow.com/a/49377181/562769
这个想法是简化这条线,直到你只剩下最相关的点。然后你把每个点都放在阈值之上(例如高于平均值),你就有了峰值。
依稀记得scipy信号处理有更复杂的方法
推荐阅读
- android - 如何从同一应用程序的另一个模块访问应用程序上下文?
- python - Python:单击下一页没有要关注的链接(javascript/AJAX)
- python - 在python中使用变量的值而不使用指向变量的指针
- c++ - openCV - 向量计算
- python - how to get python infinity with good properties
- angular - 从父组件和子组件更新值。双向。角 5.2.0
- javascript - 如何指定 HTML 应该导出哪些行/表?
- mysql - 按分数排序和其他
- javascript - Switch 语句在 JSX (React.js) 中不起作用
- c - C - 设置“popen”子进程的标准输入 - 跨平台