findpeaks-查找峰值


scipy.signal.find_peaks 是 SciPy 信号处理库中的一个函数,用于在数据序列中查找峰值(即局部最大值)。这个函数非常有用,特别是在处理时间序列数据、频谱分析和其他需要识别数据中显著特征的场景中。

函数签名

scipy.signal.find_peaks(x, height=None, threshold=None, distance=None, prominence=None, width=None, wlen=None, rel_height=0.5, plateau_size=None)

参数说明

  • x (array_like): 输入数据序列。
  • height (float or array_like or callable, optional): 峰值的高度阈值。可以是一个具体的数值、一个数组或一个函数。
  • threshold (float or array_like, optional): 相邻样本之间的最小高度差。
  • distance (float, optional): 峰值之间的最小距离。
  • prominence (float or array_like, optional): 峰值的最小显著性(即峰顶与其最低点之间的垂直距离)。
  • width (float or array_like, optional): 峰值的最小宽度。
  • wlen (int, optional): 用于计算显著性的窗口长度。
  • rel_height (float, optional): 用于计算宽度时的相对高度,默认为0.5。
  • plateau_size (float or array_like, optional): 峰值平台的最小大小。

返回值

  • peaks (ndarray): 检测到的峰值的索引。
  • properties (dict): 包含每个峰值的属性,如高度、显著性、宽度等。

示例代码

以下是一个简单的示例,演示如何使用 find_peaks 函数来查找数据序列中的峰值:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks

# 生成示例数据
np.random.seed(0)
x = np.linspace(0, 10, 1000)
y = np.sin(x) + np.random.normal(0, 0.1, 1000)

# 查找峰值
peaks, _ = find_peaks(y, height=0.5, distance=10, prominence=0.3)

# 绘制结果
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='Data')
plt.plot(x[peaks], y[peaks], 'x', color='red', label='Peaks')
plt.axhline(y=0.5, color='gray', linestyle='--', label='Height Threshold')
plt.legend()
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.title('Finding Peaks in Data')
plt.show()

解释

  1. 生成示例数据:使用 numpy 生成一个包含正弦波和随机噪声的数据序列。
  2. 查找峰值:使用 find_peaks 函数查找满足特定条件的峰值。这里设置了高度阈值(height=0.5)、最小距离(distance=10)和最小显著性(prominence=0.3)。
  3. 绘制结果:使用 matplotlib 绘制原始数据和检测到的峰值。

其他参数的使用

  • 高度阈值 (height): 只返回高度大于指定值的峰值。
  • 最小距离 (distance): 两个峰值之间的最小索引距离。
  • 显著性 (prominence): 峰值的最小显著性,即峰顶与其最低点之间的垂直距离。
  • 宽度 (width): 峰值的最小宽度,以索引数表示。

通过调整这些参数,你可以更精确地控制哪些峰值会被检测到。希望这个示例对你有所帮助!如果你有任何具体的问题或需要进一步的帮助,请随时告诉我。

scipy.signal.find_peaks