You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:20:20