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()
解释
- 生成示例数据:使用
numpy
生成一个包含正弦波和随机噪声的数据序列。 - 查找峰值:使用
find_peaks
函数查找满足特定条件的峰值。这里设置了高度阈值(height=0.5
)、最小距离(distance=10
)和最小显著性(prominence=0.3
)。 - 绘制结果:使用
matplotlib
绘制原始数据和检测到的峰值。
其他参数的使用
- 高度阈值 (
height
): 只返回高度大于指定值的峰值。 - 最小距离 (
distance
): 两个峰值之间的最小索引距离。 - 显著性 (
prominence
): 峰值的最小显著性,即峰顶与其最低点之间的垂直距离。 - 宽度 (
width
): 峰值的最小宽度,以索引数表示。
通过调整这些参数,你可以更精确地控制哪些峰值会被检测到。希望这个示例对你有所帮助!如果你有任何具体的问题或需要进一步的帮助,请随时告诉我。