使用scipy.find_peaks提取功率谱峰值出现KeyError报错求助
问题排查与解决方案
报错原因
scipy.signal.find_peaks的返回值第二个字典,仅当调用时显式传入了对应参数,才会生成对应的键值对:
- 只有传入
height参数且值不为None时,返回字典才会包含peak_heights字段 - 你当前代码中
height参数设置为None,所以返回的字典里不存在这个键,访问时自然触发KeyError
修复方案
修改find_peaks调用行的height参数,设置为符合你功率谱数据的合理阈值即可,示例如下:
# 可根据你的功率谱实际取值调整height阈值,比如设为0、均值、或指定数值 peaks, properties = find_peaks(List, height=np.mean(List), threshold=None, distance=None, prominence=None, width=None) height = properties['peak_heights']
其他代码优化建议(避免后续报错)
- 读取的txt文件返回的是DataFrame结构,建议转为一维数组再处理,防止维度不匹配报错:
power_list = pd.read_table(r'G:\Downloads\power_list_6779699.txt').values.flatten() frequency_list = pd.read_table(r'G:\Downloads\List_Frequency.txt').values.flatten() - 无需循环创建
List变量,直接将高斯滤波后的结果展平即可,性能更高:df = gaussian_filter(power_list, sigma=37) List = df.flatten() - 绘图时
scatter的颜色参数需要显式指定c,且峰值位置要和x轴单位对齐,避免点位置偏移、参数识别错误:ax.scatter(peak_pos*1e6, height, c='r', s=10, marker='D', label='Maxima')
修复后完整可运行代码
import matplotlib.pyplot as plt import pandas as pd from scipy.ndimage import gaussian_filter from scipy.signal import find_peaks import numpy as np # 导入数据并转为一维数组 power_list = pd.read_table(r'G:\Downloads\power_list_6779699.txt').values.flatten() frequency_list = pd.read_table(r'G:\Downloads\List_Frequency.txt').values.flatten() # 高斯滤波 df = gaussian_filter(power_list, sigma=37) List = df.flatten() # 查找峰值,height可根据实际数据调整 peaks, properties = find_peaks(List, height=np.mean(List)) height = properties['peak_heights'] peak_pos = frequency_list[peaks] # 绘图 fig = plt.figure() ax = fig.subplots() plt.title('KIC6779699') plt.xlim([5.6E1,1.16E2]) plt.xlabel('Frequeny(μHz)') plt.ylabel('Power density p.p.m') ax.plot(frequency_list*1E6, df, 'k', linewidth=.2) ax.scatter(peak_pos*1e6, height, c='r', s = 10, marker = 'D', label = 'Maxima') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Jeffsejr
相关产品推荐
相关产品推荐

