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

Python列表索引超出范围-查找局部最大值,python,mathematical-optimization,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(li

我有一个数据集,正在努力找出数据中的峰值;值高于其前后点的数据点

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

我的密码是:

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
然而,有一行(到目前为止)表示数据超出范围-目视检查数据并不表明这一点-该值高于上一个值,但低于下一个值-因此在图的上升段


任何帮助都会很好

我看不到您的循环,但是
(级别[I]>级别[I+1])
表明您忘记放置

for i in range(1,len(list)-1)
要注意的关键是-1,因为你在做+1,而且范围只会到max-1

在0处启动循环不会抛出越界错误,因为列表[-1]在python中是完全合法的。但是,我认为您不希望第一次比较是list[-1]>list[0]


由于编辑原因, 你不需要做这个

i=i+1


在您的代码行中,您将点击列表的长度,因为for循环也将增加,从而导致越界错误。删除该行,它应该会工作。

我看不到您的循环,但
(级别[I]>级别[I+1])
表明您忘记放置

for i in range(1,len(list)-1)
要注意的关键是-1,因为你在做+1,而且范围只会到max-1

在0处启动循环不会抛出越界错误,因为列表[-1]在python中是完全合法的。但是,我认为您不希望第一次比较是list[-1]>list[0]


由于编辑原因, 你不需要做这个

i=i+1


在您的代码行中,您将点击列表的长度,因为for循环也将增加,从而导致越界错误。删除该行,它应该会工作。

如果您使用i`在列表
l上循环,那么您应该特别处理第一点和最后一点:

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

如果使用
i`在列表上循环,则应特别处理第一点和最后一点:

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

i
指的是
level
的最后一个元素时,
level[i+1]
将不存在,当
i
指的是
level
的最后一个元素时,
level[i+1]
将不存在,并将引发
索引器

我已将其他人的答案考虑在内重新编写了此文件:

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
对于文件中的行:
line=line.split(',')
追加时间(浮点(行[0]))
TP.append(float(第[3]行))
level.append(浮动(第[5]行))
峰值=[0]*len(电平)
numPeaks=0
对于范围(1,透镜(级别)-1)内的i:
如果等级[i-1]<等级[i]和等级[i+1]<等级[i]:
峰值[i]=1
numPeaks+=1
打印numPeaks

我将其他人的答案考虑在内,重新编写了这篇文章:

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
对于文件中的行:
line=line.split(',')
追加时间(浮点(行[0]))
TP.append(float(第[3]行))
level.append(浮动(第[5]行))
峰值=[0]*len(电平)
numPeaks=0
对于范围(1,透镜(级别)-1)内的i:
如果等级[i-1]<等级[i]和等级[i+1]<等级[i]:
峰值[i]=1
numPeaks+=1
打印numPeaks


向我们展示您的所有代码。如何定义
i
?您似乎试图访问一个超过列表末尾的索引。如果
i
达到最后一个列表项的索引,
级别[i+1]
将尝试访问不存在的列表项。请展示整个循环!当你有
level[i-1]
level[i+1]
时,当
i
0
len(level)-1
(即最大索引)时会发生什么?它说什么“超出范围”?怎么说呢?要从错误消息中获取任何信息,您必须仔细阅读它们。作为补充说明,使用NumPy将(本质上)变成
peaks=(级别[1:-1]>level[:-2])&(级别[1:-1]>level[2:])
。向我们展示您的所有代码。如何定义
i
?您似乎试图访问一个超过列表末尾的索引。如果
i
达到最后一个列表项的索引,
级别[i+1]
将尝试访问不存在的列表项。请展示整个循环!当你有
level[i-1]
level[i+1]
时,当
i
0
len(level)-1
(即最大索引)时会发生什么?它说什么“超出范围”?怎么说呢?要从错误消息中获取任何信息,您必须仔细阅读它们。作为补充说明,使用NumPy这将(本质上)成为
peaks=(level[1:-1]>level[:-2])&(level[1:-1]>level[2:])
。OP也会在他们的支票中获得item
i-1
。这是真的,我把它放在循环中了,但忘了提及:谢谢。等等,negitave Indicate不会通过越界错误,因为python支持它。这是真的,但它是否给出了预期的行为是另一回事。是的,但这不是OP的问题,你让我困惑了一秒钟:P,我将在我的回答中包括不想要的行为,好主意。OP在他们的检查中也得到了item
i-1
。这是真的,我把它放在了循环中,但忘了提到:谢谢。等等,negitave indice不会通过越界错误,因为python支持它。这是真的,但它是否给出了预期的行为是另一回事。是的,但这不是OP的问题,你刚才把我弄糊涂了:P,我会在我的回答中包括不想要的行为,好主意。对于文件中的行。readlines():peaks.append(0)line=line.split(‘,’)time.append(float(line[0])TP.append(float(line[3])level.append(float(line[5])对于范围内的i(len(level)-1):i=i+1如果(level[i]>level和(水平[i]>水平[i+1]):峰值[