我寫了一個函式,它并沒有結束。邏輯上 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
uj5u.com熱心網友回復:
永遠不會執行以下(簡化的)邏輯
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
uj5u.com熱心網友回復:
這可能是因為您在 for 回圈中從檔案陣列中洗掉元素,并且還嘗試使用檔案陣列迭代 for 回圈。嘗試迭代一個干凈版本的檔案陣列(沒有修改),并對檔案陣列的副本進行洗掉
例如,一種可能的解決方案是修復這條線
for i in range(1, len(file)):
修復如下
N=len(file)
for i in range(1, N):
您也可以洗掉標志變數 'check' 并替換為 break 陳述句
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349959.html
