2012-03-19 94 views
0

我有一個數據集,並試圖找出數據中有峯值的位置;一個數據點的值比它之前和之後的點高。Python列表索引超出範圍 - 查找本地最大值

我有代碼適用於一個數據集,但現在將其轉移到另一個數據集會導致索引超出某些行的範圍錯誤。

我的代碼是:

for line in file.readlines(): 
    peaks.append(0) 
    line = line.split(',') 
    time.append(float(line[0])) 
    TP.append(float(line[3])) 
    level.append(float(line[5])) 


for i in range(len(level)-1): 
    i = i + 1 
    if (level[i] > level[i-1]) and (level[i] > level[i+1]): 
     peaks[i] = 1 
     noPeaks = noPeaks +1 

print noPeaks 

然而,對於一個線(迄今爲止)它說的數據是超出範圍 - 目測觀察的數據並不表明這一點 - 價值比以前更高價值但低於下一個圖表的上升。

任何幫助將是偉大的!

+2

告訴我們所有的代碼。你如何定義'我'? – 2012-03-19 12:46:20

+2

您好像試圖訪問列表末尾的索引。如果'i'到達最後列表項的索引,'level [i + 1]'將嘗試訪問不存在的列表項。請展示整個循環! – 2012-03-19 12:47:24

+0

當你有'level [i-1]'和'level [i + 1]'時,當'i'是'0'或'len(level)-1'(即最大索引)時會發生什麼? – 2012-03-19 12:49:03

回答

3

我看不到你的循環,但(level[i] > level[i+1])建議你忘了把

for i in range(1,len(list)-1) 

關鍵注意,是因爲-1你正在做的是+1和範圍只到MAX-無論如何。

從0開始你的循環不會拋出越界錯誤,因爲list [-1]在python中是完全合法的。不過,我不認爲你希望你的第一次比較是列表[-1]>列表[0]


由於編輯, 你不需要做

i = i + 1

在你的代碼中,你會碰到列表的長度,因爲for循環也會增加,導致出界限錯誤。刪除該行,它應該工作。

+0

OP也在他們的支票中獲得物品「i-1」。 – 2012-03-19 12:48:10

+0

這是真的,我把它放在循環中,但忘了提及它:S謝謝。 – Serdalis 2012-03-19 12:49:22

+0

掛起,因爲python支持它,所以negitave indice不會通過越界錯誤。 – Serdalis 2012-03-19 12:51:44

1

如果你遍歷列表l using i`,那麼你應該採取特別處理第一和最後一個點:

for i in xrange(1, len(l) - 1): 
    # your check 
+0

在file.readlines()行: \t peaks.append(0) \t線= line.split( '') \t time.append(浮法(行[0])) \t TP.append(浮法(線[3])) \t level.append(浮法(行[5])) \t 爲i的範圍(LEN(電平)-1): \t I = I + 1 \t如果(水平[i]>水平[i-1])和(水平[i]>水平[i + 1]): \t \t峯[i] = 1 \t \t noPeaks = noPeaks +1 \t \t print noPeaks – Chris 2012-03-19 12:49:48

+0

@Chris:請編輯它到您原來的問題。代碼片段,尤其是Python,在註釋中不可讀。 – 2012-03-19 12:51:39

0

i被提及的level最後一個元素,level[i+1]會不存在,並將提高IndexError

0

我已經重寫這個要考慮到別人的答案:

for line in file: 
    line = line.split(',') 
    time.append(float(line[0])) 
    TP.append(float(line[3])) 
    level.append(float(line[5])) 

peaks = [0]*len(level) 
numPeaks = 0 
for i in range(1, len(level)-1): 
    if level[i-1] < level[i] and level[i+1] < level[i]: 
     peaks[i] = 1 
     numPeaks += 1 

print numPeaks