2012-03-19 10 views
0

私はデータセットを持っており、データにピークがある場所を解決しようとしています。その前後のポイントよりも高い値を持つデータポイント。Pythonリストのインデックスが範囲外です - ローカル最大値を見つける

私は1つのデータセットに対して機能するコードを持っていますが、別のデータセットにそれを転送すると、特定の行に対して範囲外のエラーが発生します。

私が持っているコードは次のとおりです。

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 

しかし、1つのライン(今のところ)それはデータが範囲外であると言うために - データを視覚的に検査することは、これを示唆していない - 値が前回よりも高く、グラフの立ち上がりでは次の値よりも低くなります。

助けがあれば助かります。

+2

は私達にあなたのすべてのコードを示しています。あなたは 'i'をどう定義しますか? –

+2

リストの最後を過ぎてインデックスにアクセスしようとしているようです。 'i'が最後のリスト項目のインデックスに達した場合、' level [i + 1] 'は存在しないリスト項目にアクセスしようとします。ループ全体を見せてください! –

+0

'level [i-1]'と 'level [i + 1]'があるとき、 'i'が' 0'か 'len(level)-1'(つまりmax index)のときはどうなりますか? –

答えて

3
私はあなたのループを見ることはできません

しかし(level[i] > level[i+1])はあなたが注意すべき

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

キーを置くことを忘れているあなたが+1ことや範囲をやっているだけなのでMAX-に行くことに-1があることを示唆しています1とにかく。

リスト[-1]はPythonでは完全に正当であるため、ループを0にすると範囲外のエラーは発生しません。しかし、私はあなたが

i = i + 1

をする必要はありません 、あなたが最初の比較がリストになりたいと思ういけない[-1]> [リストの編集のために[0]


あなたがコードであるなら、あなたはリストの長さに達するでしょう。なぜなら、forループもまた増加し、範囲外のエラーを引き起こすからです。その行を削除すると正常に動作するはずです。あなたは、リストの上にl using i`をループしている場合は、あなたが特別に両方の最初と最後の点を処理するためにとるべき

+0

OPはまた、チェックの項目 'i-1'を取得しています。 –

+0

本当に、私はループに入れましたが、言及するのを忘れてしまった:Sありがとう。 – Serdalis

+0

がハングすると、Pythonがサポートしているので、負のインデックスは範囲外のエラーではありません。 – Serdalis

1

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

: \t peaks.append(0) \tライン= line.split( '') \t time.append(フロート(ライン[0])) \t TP.append(フロート(ライン[3])) \t level.append(フロート(ライン[5]))の範囲内のiについて \t(LEN(レベル)-1): \t I = I + 1 \t IF( \t \t peaks [i] = 1 \t(レベル[i]>レベル[i-1])とレベル[i]noPeaks = noPeaks +1 \t \t print noPeaks – Chris

+0

@Chris:元の質問に編集してください。コードスニペット、特にPythonは、コメントで読むことができません。 –

0

ilevelの最後の要素を参照している、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 
関連する問題