如何修复本应仅累加却异常执行减法操作的数组遍历计数器
问题场景
- 目标:遍历数组
duv索引1到n-2位置的元素,统计「同时大于左右相邻元素,或同时小于左右相邻元素」的元素累计个数,计数器初始值为0,递推规则为val[i]的值仅能基于val[i-1]保持不变或加1 - 异常表现:代码运行时计数器偶尔出现重置为0、数值减1的异常,不符合递推逻辑
- 预期正确输出的val数组:
[0, 0, 1, 2, 2, 2, 2, 3, 4] - 原始出错代码:
duv = np.array([24, 12, 0, 6, 3, 0, -3, -6, -3, -6]) val = [] val = np.append(val, 0) print('start_val = ', val[0]) for i in range (1, 9): if duv[[i-1]] > duv[[i]] and duv[[i+1]] > duv[[i]]: new_val = val[[i-1]] + 1 val = np.append(val, new_val) if duv[[i-1]] < duv[[i]] and duv[[i+1]] > duv[[i]]: new_val = val[[i-1]] + 1 val = np.append(val, new_val) else: new_val = val[[i-1]] val = np.append(val, new_val) print(val)
错误原因
代码存在两个核心逻辑问题:
- 分支结构错误:两个判断使用独立
if而非互斥分支,当第一个if条件命中、追加了新值到val后,第二个if的else分支会继续执行,导致单次循环向val中追加2个元素。后续迭代取val[i-1]时会取到错位的数值,直接引发计数器值跳变、重置的异常。 - 峰谷判断逻辑错误:第二个判断条件仅判断了「左邻小于当前、右邻大于当前」的非峰谷场景,完全漏掉了「当前元素同时大于左右相邻元素」的峰值判定条件,统计规则本身不符合需求。
注:代码中用[[i]]形式的列表索引numpy数组不会引发计算错误,只是会生成长度为1的一维数组,不是导致异常的核心原因。
修复方案
- 将两个独立
if改为if/else互斥分支,合并谷值、峰值的判定条件,保证单次循环仅向val追加1个元素 - 修正峰值判定逻辑,补充「右邻小于当前元素」的判断,覆盖所有符合计数要求的场景
- 直接使用整数下标索引numpy数组取标量值,简化冗余写法
修复后代码
import numpy as np duv = np.array([24, 12, 0, 6, 3, 0, -3, -6, -3, -6]) val = np.array([0]) print('start_val = ', val[0]) for i in range(1, 9): # 判定谷值:当前元素比左右都小 is_valley = duv[i-1] > duv[i] and duv[i+1] > duv[i] # 判定峰值:当前元素比左右都大 is_peak = duv[i-1] < duv[i] and duv[i+1] < duv[i] if is_valley or is_peak: new_val = val[i-1] + 1 else: new_val = val[i-1] val = np.append(val, new_val) print(val)
运行上述代码将输出和预期完全一致的结果:[0. 0. 1. 2. 2. 2. 2. 3. 4.]
内容的提问来源于stack exchange,提问作者brezelbayer
相关产品推荐
相关产品推荐

