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
我写了一个函数,它没有结束。逻辑上 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