2012-03-19 95 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