2017-07-30 87 views
0

我是一個Python初學者,我確實明白在這種情況下有什麼不對,SetVel[i+4]超出了範圍。但我無法糾正它。任何幫助將是驚人的。這裏是我的代碼:如何刪除for循環的'索引超出範圍'錯誤?

OutSmooth = [] 
IndexOut = [] 
IndSmooth = [] 
length = len(SetVel) 
for i in range(2, length-3): 
    diffnext = (SetVel[i+4])- (SetVel[i+3]) 
    diffprev = (SetVel[i+1])-(SetVel[i]) 
    diff1 = SetVel[i+2]-SetVel[i+1] 
    diff2 = SetVel[i+3]-SetVel[i+2] 
    if diff1 < 1.5*diffprev or diff2 < 1.5*diffnext: 
     IndSmooth.append(SetVel.index(SetVel[i+2])) 
    else: 
     OutSmooth.append(SetVel[i+2]) 

PS:對於那些問這是什麼居然是:這是我的非衍生曲線平滑的嘗試。在我的主程序中,我確實有一個基於NumPy的衍生曲線平滑機制,但是我已經完成了這個工作,這是爲了我的理解和備份。由於

編輯:

break後病情一道努力消除錯誤,但代碼只有一次運行該塊。只有一個指數附加

+1

您的range()轉到了'length-3',所以'i + 4'會超出'SetVel'的長度。 – AChampion

+0

是的,我明白錯誤的原因,所以解決方案將它限制爲[i]而不是集合中增加的元素? –

+0

現在的問題是,它只打印一個元素作爲答案,因爲休息,這絕對不是真的 –

回答

1

您正在使用i,只是length-3之前馬克塞斯,在length-4(這INFACT等於len(SetVel)-4迭代。

按照這樣的邏輯,如果i = len(SetVel)-4然後SetVel[i+4]等於SetVel[len(SetVel)-4+4],或SetVel[len(SetVel)]

所有這些只是爲了告訴你錯誤的原因 - 你正在尋找一個索引本身的長度,這不會是好的,因爲索引從0開始而不是1。 -1從長度。

換句話說,更換

for i in range(2, length-3): 

隨着

for i in range(2, length-4): 

最後,如果你break循環在它的結束,無條件的,你得到它只有一個迭代(只有一個結果),所以只是不這樣做

0

高度規則的數學表達式可能更清晰,索引結果而不是命名變量
和Pytho ñ真的喜歡消費的迭代器

,一旦你用來列出內涵,zip()我想生成的差異文件,名單可能會更清晰

SetVel = [math.sin(math.pi*(n % 10 - 5)/5) for n in range(20)] 

diffs = [[ e1 - e0, e2 - e1, e3 - e2, e4 - e3 ] 
     for e0, e1, e2, e3, e4 
      in zip(SetVel, 
        SetVel[1:], 
        SetVel[2:], 
        SetVel[3:], 
        SetVel[4:])] 

OutSmooth = [] 
IndSmooth = [] 
delta = 1.5 # may want to change the constant, do it one place 

for i, d in enumerate(diffs): 
if d[1] < delta*d[0] or d[2] < delta*d[3]: 
     IndSmooth.append(i+2) # a guess at what you really wanted 
    else: 
     OutSmooth.append(SetVel[i+2]) 

IndSmooth 
Out[64]: [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17] 

OutSmooth 
Out[65]: [0.0, 0.0] 

一個常見的編程目標是參數化,自動化,所以這裏輸入的是您需要的差異數量,其餘部分是自動的

n_diff = 4 

diffs = [[g - f for f, g in zip(e, e[1:])] 
       for e in zip(*[SetVel[n:] 
           for n in range(n_diff+1)])] 
+0

哇..這很有道理!謝謝! –

+0

upvotes是首選的Stack Exchange反饋,即使它不直接回答你的問題,請記住當你有15個聲望點時 – f5r5e5d

相關問題