Индекс списка Python вне диапазона - поиск локальных максимумов - PullRequest
0 голосов
/ 19 марта 2012

У меня есть набор данных, и я пытаюсь определить, где есть пики в данных;точка данных с более высоким значением, чем точка до и после нее.

У меня есть код, который работает для одного набора данных, но теперь при его переносе в другой набор данных для определенного ряда выводится ошибка индекса диапазона.

Код, который у меня есть:

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 ]

4 голосов
/ 19 марта 2012

Я не вижу ваш цикл, но (level[i] > level[i+1]) говорит о том, что вы забыли поставить ключ

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

, чтобы отметить, что это -1, так как вы делаете это +1, и диапазон только идетв любом случае до max-1.

Запуск цикла в 0 не приведет к ошибке выхода за границы, поскольку list [-1] совершенно допустим в python.однако, я не думаю, что вы хотите, чтобы ваше первое сравнение было списком [-1]> списком [0]


Из-за редактирования вам не нужно делать

i = i + 1

В строке кода вы попадете на длину списка, поскольку цикл for также будет увеличиваться, вызывая ошибку выхода за границы.Удалите эту строку, и она должна работать.

1 голос
/ 19 марта 2012

Если вы зацикливаетесь на списке l using i`, то вам следует обратить особое внимание как на первую, так и на последнюю точку:

for i in xrange(1, len(l) - 1):
    # your check
0 голосов
/ 19 марта 2012

Я переписал это с учетом ответов других людей:

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
0 голосов
/ 19 марта 2012

Когда i относится к последнему элементу level, level[i+1] не будет существовать и вызовет IndexError.

...