Python列表索引超出范围 - 查找局部最大值

时间:2012-03-19 12:44:29

标签: python mathematical-optimization

我有一个数据集,我正在尝试找出数据中存在峰值的位置;数据点的值高于其之前和之后的点。

我的代码适用于一个数据集,但现在将其传输到另一个数据集会导致某些行的索引超出范围错误。

我的代码是:

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

然而,对于一行(到目前为止),它表示数据超出范围 - 目测检查数据并不表明这一点 - 该值高于先前的值但低于下一个值,因此在图的上升部分

任何帮助都会很棒!

4 个答案:

答案 0 :(得分:4)

我看不到你的循环,但(level[i] > level[i+1])暗示你忘记了

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

要注意的是,因为你正在做那个+1,所以该范围只会达到最大值-1。

从0开始循环不会抛出越界错误,因为list [-1]在python中是完全合法的。但是,我不认为你想要你的第一个比较是列表[-1]>列表[0]


由于编辑,

你不需要这样做

i = i + 1

在你的代码中输入

,你将达到列表的长度,因为for循环也会增加,导致越界错误。删除该行,它应该工作。

答案 1 :(得分:1)

如果您循环遍历列表l using i`,那么您应该专门处理第一个和最后一个点:

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

答案 2 :(得分:0)

i引用level的最后一个元素时,level[i+1]将不存在,并会引发IndexError

答案 3 :(得分: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