python 无限循环和 numpy 删除不能正常工作

python infinite loop and numpy delete do not work properly

我写了一个函数,它没有结束。逻辑上 len(array) 应该减少,但它停留在 227。我认为 numpy delete 不能正常工作或者我在某处出错了??

def segmenting (file, threshold):
    segments = []
    check = True
    count = 0
    while check == True:
        if len(file) <= 2:
            check = False
        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)
            print(i)
            if magnitude <= threshold:
                sequence.append(file[i])
                ids.append(i)
            if i == len(file) and len(sequence) == 0:
                file = np.delete(file, 0 , axis = 0)
                break
        
        if len(ids) >0 and len(sequence)>0 :
            segments.append(sequence)
            file = np.delete(file, ids , axis = 0)
        print('sequence after :',sequence)        
        sequence = []
        ids = []
        print(len(file))

    return segments

这可能是因为您在 for 循环中从文件数组中删除元素,并且还尝试使用文件数组迭代 for 循环。尝试迭代一个干净版本的文件数组(没有修改),并删除文件数组的副本

例如,一种可能的解决方案是修复这条线

for i in range(1, len(file)):

按如下方式修复

N=len(file)
for i in range(1, N):

您也可以删除标志变量 'check' 并替换为 break 语句

永远不会执行以下(简化的)逻辑

for i in range(1, len(file)):
   if i == len(file):
       file = np.delete(file, 0)

如果无法删除文件的第一行,您就无法耗尽数组。无论如何,这项检查都是多余的,因为在每次迭代之后,您将不再需要第一行。

作为第一个修复,您可以将检查放在循环之外,只检查您是否找到任何匹配项

for i in range(1, len(file)):
    ...
if len(sequence) == 0:
    file = np.delete(file, 0)

但是这样一来,您将进行一次迭代,找到(并删除)匹配项,然后再进行一次没有更多匹配项的迭代,然后将其删除。因此,如上所述,您应该始终在每次迭代后删除第一行。

通过更多的简化,您的代码可以减少到:

def segmenting(file, threshold):
    segments = []
    while len(file) > 2:
        idx = np.sqrt(np.sum((file[1:,1:3] - file[0,1:3])**2, axis=1)) <= threshold
        file = file[1:]
        segments.append(list(file[idx]))
        file = file[np.logical_not(idx)]
    return segments