scipy.signal.argrelmin返回空值及索引越界错误问题咨询
scipy.signal.argrelmin使用问题排查方案
问题1:min_idxs为空的原因
- 核心原因:
argrelmin默认仅查找序列内部的局部极小值,要求极小值点必须同时小于左右相邻的两个点,以下两种场景会返回空数组:- 距离序列的最小值出现在序列首尾边界处:此时最小点只有单侧邻居,不符合
argrelmin的默认判定规则,不会被识别 - 距离序列整体单调:你拟合的是二次多项式曲线,部分点到曲线的距离会随x递增/单调递减,全程没有内部局部极小值,自然返回空
- 距离序列的最小值出现在序列首尾边界处:此时最小点只有单侧邻居,不符合
- 解决方法:你第二段代码中补充的判断逻辑已经可以解决该问题,空的时候手动把全局最小值的索引加入即可:
if not min_idxs.size: min_idxs = [np.argmin(dis)]
问题2:IndexError索引越界的原因
- 核心原因:索引对应数组完全混淆
glob_min_idx2是距离数组dis2的索引,dis2和你构造的拟合曲线数组x、y长度一致,你的x是步长0.05从40000到53000的序列,总长度超过26万,所以glob_min_idx2的数值会到几万甚至几十万- 但你错误地用这个索引去取长度仅为39的
x_data数组的元素,x_data最大合法索引是38,自然会报索引越界错误
- 解决方法:取拟合曲线上最近点的坐标时,应该用
glob_min_idx2去索引x和y数组,而非x_data/y_data:
# 错误写法 min_x2 = x_data[glob_min_idx2] min_y2 = y_data[glob_min_idx2] # 正确写法 min_x2 = x[glob_min_idx2] min_y2 = y[glob_min_idx2]
内容的提问来源于stack exchange,提问作者Elena Greg
相关产品推荐
相关产品推荐

