如何使scipy.signal.find_peaks识别数组负数区平台的首个局部极小值?
解决scipy.signal.find_peaks无法识别平台区域首个极小值的问题
你的问题出在signal.find_peaks的默认行为上——它只识别严格大于相邻点的峰值,而原数组中索引6对应的平台区域(-1,-1),取反后变成平顶(1,1),不符合默认的峰值判定条件。要让它识别这类平台并返回首个元素,只需调整find_peaks的两个参数:
plateau_size=(1, None):允许识别包含连续相等值的平台型峰值,参数表示平台长度至少为1(兼容普通单个点的峰值)。left_based=True:当峰值是平台时,返回平台的第一个索引,和你原代码的逻辑对齐。
修改后的完整代码如下:
import numpy as np from scipy import signal test = np.array([0, 1, 2, 3, 1, 0, -1, -1, -2, -3, -2, 0]) wanted_mins = np.where(((test[:-2] > test[1:-1]) * (test[2:] >= test[1:-1])) & (test[1:-1] < 0))[0] + 1 # 调整参数后的重构代码 neg_test = np.negative(np.where(test < 0, test, 0.0)) refactored_mins = signal.find_peaks(neg_test, plateau_size=(1, None), left_based=True)[0] print(wanted_mins) # 输出: [6 9] print(refactored_mins) # 输出: [6 9]
验证后,refactored_mins的结果会和wanted_mins完全一致,同时保留了用signal.find_peaks的简洁性。
内容的提问来源于stack exchange,提问作者cicciodevoto
相关产品推荐
相关产品推荐

