如何查找数据集中超出任意指定阈值的峰值对应的x轴数值
峰值提取实现方案
你提供的数据集为pandas Series结构,索引PixelNo即为你需要的x值,Series值为对应信号强度,可通过scipy.signal.find_peaks快速实现阈值筛选峰值的需求,步骤如下:
1. 依赖安装
如果未安装相关依赖,执行以下命令:
pip install pandas scipy numpy
2. 代码实现
核心逻辑说明
- 如果你给出的阈值
0.35为归一化后的值,需要先将原始信号归一化到0-1区间;如果阈值是和原始信号值匹配的数值,可以跳过归一化步骤,直接把阈值传入height参数即可。 - 可通过额外参数调整峰值筛选规则,比如
distance设置两个峰的最小间隔像素数、prominence设置峰的突出程度,过滤毛刺噪声峰。
import pandas as pd from scipy.signal import find_peaks # 假设calib_1为你读取到的单组Series数据 # 如需归一化到0-1区间使用0.35阈值,执行以下代码 normalized_signal = (calib_1 - calib_1.min()) / (calib_1.max() - calib_1.min()) # 查找超过指定阈值的峰值,返回的peaks为符合条件的峰值在Series中的位置索引 peaks, _ = find_peaks( normalized_signal, # 如不需要归一化,这里替换为calib_1,同时修改下面的height为对应原始阈值 height=0.35, # 指定阈值 # distance=3, # 可选:两个峰值至少间隔3个像素才会被识别,根据需求调整 # prominence=0.1 # 可选:过滤毛刺小峰,根据需求调整 ) # 提取峰值对应的x值(PixelNo) peak_x_list = calib_1.index[peaks].tolist() # 输出结果 print(peak_x_list)
3. 示例效果
用你给出的开头几个数据测试:
# 模拟示例数据 calib_1 = pd.Series( [821.0, 943.0, 806.0, 753.0, 834.0], index=[0,1,2,3,4], name='Calib_1' ) normalized_signal = (calib_1 - calib_1.min())/(calib_1.max()-calib_1.min()) peaks, _ = find_peaks(normalized_signal, height=0.35) print(calib_1.index[peaks].tolist())
运行后输出为[1, 4],即对应数值最高的两个峰值的PixelNo值。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

