使用Python SciPy检测峰值时遭遇索引错误的解决咨询
问题分析与解决方案
原代码的核心错误
- 变量顺序颠倒:计算
zero_locs时x尚未定义,实际运行会先触发NameError,代码需先定义数据再执行后续逻辑。 - 索引错误根源:你的数据
x中没有0值,np.where(x==0)返回空数组,np.append(zero_locs, len(x))生成了包含空数组的object类型数组,后续用它作为索引切片时,空数组无法被识别为整数索引,触发IndexError。 - 峰值检测逻辑缺陷:手动通过差分找峰值的方式鲁棒性差,无法准确识别符合“波谷>0”的峰值。
正确实现方案
直接使用scipy.signal.find_peaks,通过参数配置+额外验证满足需求:
height=20:筛选峰值大于20的点- 验证相邻峰值之间的波谷(区间最小值)是否大于0
完整代码如下:
import numpy as np from scipy.signal import find_peaks import matplotlib.pyplot as plt # 先定义数据,确保变量顺序正确 x = np.array([1, 9, 18, 24, 26, 5, 26, 25, 26, 16, 20, 16, 23, 5, 1, 27, 22, 26, 27, 26, 25, 24, 25, 26, 3, 25, 26, 24, 23, 12, 22, 11, 15, 24, 11, 26, 26, 26, 24, 25, 24, 24, 22, 22, 22, 23, 24]) # 第一步:检测所有峰值大于20的点 peaks, _ = find_peaks(x, height=20) # 第二步:筛选相邻峰值间波谷大于0的有效峰值 valid_peaks = [] if len(peaks) > 0: valid_peaks.append(peaks[0]) for i in range(1, len(peaks)): # 计算两个峰值之间的区间最小值(波谷) valley_min = np.min(x[peaks[i-1]:peaks[i]]) if valley_min > 0: valid_peaks.append(peaks[i]) # 可视化结果 fig = plt.figure(figsize=(10,4)) plt.plot(x) plt.plot(valid_peaks, x[valid_peaks], "x", color='r') plt.title('Valid Peaks (height>20, valley>0)') plt.show()
代码说明
- 变量顺序修正:先定义数据
x,避免未定义错误。 - 专业峰值检测:
find_peaks是scipy专门的峰值检测函数,height=20直接筛选峰值大于20的点,比手动差分更可靠。 - 波谷验证:遍历检测到的峰值,计算相邻峰值间的区间最小值(波谷),只保留满足波谷>0的峰值,精准匹配需求。
- 彻底解决索引错误:全程使用整数索引,无非法的object类型数组参与索引操作。
内容的提问来源于stack exchange,提问作者user20759431
相关产品推荐
相关产品推荐

