我有一个数据集,我正在尝试找出数据中存在峰值的位置;数据点的值高于其之前和之后的点。
我的代码适用于一个数据集,但现在将其传输到另一个数据集会导致某些行的索引超出范围错误。
我的代码是:
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
然而,对于一行(到目前为止),它表示数据超出范围 - 目测检查数据并不表明这一点 - 该值高于先前的值但低于下一个值,因此在图的上升部分
任何帮助都会很棒!
答案 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