Python代码出现无限循环且numpy.delete未正常生效问题求助
问题根源
代码死循环是核心逻辑判断存在不可达分支导致的,具体问题如下:
- 你设置的
for i in range(1, len(file))循环中,i的取值范围是1 到 len(file)-1,永远不可能等于len(file),因此if i == len(file) and len(sequence) == 0:这个分支永远不会被触发。当数组第一个元素和后续所有元素的距离都超过阈值时,ids和sequence始终为空,既不会删除匹配的索引,也不会删除首个不匹配的元素,数组长度自然会卡住不变。 - 额外的逻辑漏洞:当
len(file) <= 2时你仅将check设为False,但当前轮次的循环逻辑还是会完整执行一遍,不会立刻终止循环。
修复方案
调整删除首元素的判断位置,放在for循环结束之后,同时优化终止逻辑:
import math import numpy as np def segmenting(file, threshold): segments = [] while len(file) > 2: # 直接用数组长度作为循环判断条件,不需要额外的check变量 sequence = [] ids = [] for i in range(1, len(file)): vector = [file[i,1] - file[0,1], file[i,2] - file[0,2]] magnitude = math.sqrt(vector[0]**2 + vector[1]**2) if magnitude <= threshold: sequence.append(file[i]) ids.append(i) # 把删除首元素的判断移到for循环结束后 if len(sequence) > 0: segments.append(sequence) file = np.delete(file, ids, axis=0) else: # 没有匹配的元素,删除首元素 file = np.delete(file, 0, axis=0) print('当前数组长度:', len(file)) return segments
补充说明
如果要进一步优化性能,可以替换模长计算的实现:用np.linalg.norm代替手动计算,避免循环中频繁调用math.sqrt的开销,示例如下:magnitude = np.linalg.norm(file[i, 1:3] - file[0, 1:3])
内容的提问来源于stack exchange,提问作者Daulet Karim
相关产品推荐
相关产品推荐

