You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取非规则振荡曲线的函数或峰值点?有无Python库内置方法?

振荡曲线的峰值提取与函数拟合方案

峰值点提取

NumPy 实现

用numpy.argrelextrema()可以快速定位局部峰值,它通过比较相邻元素判断极值:

import numpy as np

# x为横轴数据,y为曲线纵轴数据
peak_indices = np.argrelextrema(y, np.greater)[0]
peak_x = x[peak_indices]
peak_y = y[peak_indices]

通过order参数可设置极值判断的窗口大小,过滤由噪声产生的伪峰值,比如order=3表示当前点需比前后3个点都大才判定为峰值。

更精准的补充方案

如果需要过滤低高度、近间距的峰值,用scipy.signal.find_peaks()更灵活,支持高度、间距、宽度等阈值设置:

from scipy.signal import find_peaks

peaks, props = find_peaks(y, height=0.3, distance=8)  # 仅保留高度≥0.3、间距≥8的峰值

曲线函数拟合

由于你的曲线振幅和周期均不固定,属于非平稳振荡信号,不存在单一数学方程能完美拟合,可尝试以下思路:

  • 分段拟合:将曲线按周期变化区间拆分,每个子区间用「时变振幅+时变周期的正弦/余弦函数+趋势项」拟合,比如y = A(x)·sin(B(x)·x + C) + D(x),其中A(x)、B(x)可用多项式或样条函数近似。
  • 非参数平滑拟合:用样条插值生成平滑曲线,无需预设模型,适合不规则振荡:
from scipy.interpolate import UnivariateSpline

spline = UnivariateSpline(x, y, s=4)  # s为平滑因子,值越大曲线越平滑
y_fit = spline(x)
  • 机器学习回归:数据量充足时,可尝试决策树、神经网络等模型学习非线性关系,但模型解释性较差。

NumPy、Matplotlib、Pandas 相关内置函数情况

  • NumPy:无直接曲线拟合函数,但numpy.polyfit()可做多项式拟合(仅适合趋势部分);numpy.argrelextrema()用于极值点检测。
  • Matplotlib:仅为绘图库,无峰值检测或拟合函数,但可将检测到的峰值标注在图上:
import matplotlib.pyplot as plt

plt.plot(x, y)
plt.scatter(peak_x, peak_y, c='red', marker='x', label='Peaks')
plt.legend()
plt.show()
  • Pandas:专注数据处理,无直接峰值/拟合函数,但可通过pd.Series.rolling()做滑动窗口分析辅助峰值识别,或完成时间序列的预处理(如重采样、缺失值填充)。

内容的提问来源于stack exchange,提问作者a_cris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:23:11