2017-07-10 10 views
1

私は散布図をプロットするために使用しているデータセットを持っています。このデータを2つの別々のリスト「時間」と「高さ」にソートしました。 「時間」リストの各インデックスは、「高さ」リストの同じインデックスに対応しています。問題は、データを測定するために使用された機器が誤動作し、高さの値の一部がゼロとして読み取られることがあることです。ですから、高さが0である時間と高さの両方のリストのすべてのインデックスを削除する必要があります。 ここで私が使用しているコードのセクションです:この背後にある考え方は、高さリストのすべての値がゼロに等しい値で検索されるだろうし、その後、彼らは削除されるだろうということでした対応するリストから値を削除するにはどうすればよいですか?

for i in range(0, np.size(time)): 
     if height[i]=0 
      del time[i] 
      del height[i] 

、および時間リストの対応するインデックスも削除され、すべてがクールなビーンになります。 はしかし、私はこのエラーを取得する:

Traceback (most recent call last): 
     File "NewData.py", line 38, in <module> 
     if height[i]=0: 
    IndexError: list index out of range 

誰もがこの問題を解決する方法を説明することができ、または同じことを達成するために、新しいコードを書くためにどれだけ?

+0

_not_これを行うようにしてください。 –

+1

高さ[i] == 0: '今はheight [i]に0を代入しようとしているはずです。 – J0hn

答えて

3

を入力する必要はありません。リストを反復処理するときにリストを変更します。これはループが削除の発生を認識していないため、副作用を引き起こします。ここで

は、リストの内包表記を使用して、より良い方法です:

time = [x for i, x in enumerate(time) if height[i]] 
height = [x for x in height if x] 

これは、あなたが削除しない希望するだけの要素を保つことによって、リストの内包表記を使用して新しいリストを作成します。

+0

技術的には、最高インデックスから反復された場合、最低にもちろん、アイテムが削除されるたびに左シフトが発生するため、それは非常に効率的ではないので、まだ悪い考えです。 –

+0

@StevenRumbalski真実、私はそれが可能であることに同意するでしょう。 –

+0

いいえ、アルゴリズムが悪いために膨大な量のデータには意味をなさないでしょう。 100万個のアイテム配列内のアイテム0を削除するには、1アイテム左に999,999,999個のアイテムをコピーする必要があります。私はちょうど「してはいけない」が本当に「すべきではない」と指摘していました。 –

-1

高さがゼロのものを無視しないのはなぜですか。削除を行わず、新しいリストを作成したり、要素をコピーしたりします。したがって、散布図をプロットする場合は、高さがゼロより大きい場合にのみプロットを更新してください。

+0

OPのユースケースを前提にしているため、これは正しくありません。 –

+0

あなたが言っていることをサポートする証拠を追加する必要があります – DarkCygnus

0

私はそのようなループしながら、np.delete()を使用するpreffer:heigthが0であれば、あなたがにことを確認して、カウンタは、インクリメントしないことを

i=0 
limit=np.size(time) 
while(i<limit): 
    if height[i]==0: 
     time=np.delete(time,i) 
     height=np.delete(height,i) 
     limit-=1 
    else: 
     i+=1 

は注意新しい配列次元のインデックスを作成しません。

0

ほとんどの言語と同様、反復処理中にリストから削除することは素晴らしい考えではありません。その理由は、ループのたびにiのエンドポイントがチェックされないためです。たとえば、np.size(time)==10の場合、最初に削除された要素の後に、新しい長さはとなりますが、iはまだ9に増分し続けます。これはもはや存在しない要素time[9]にアクセスしようとします。

幸運なことに、Pythonにはこれに対処する方法がたくさんあります。この方法では、リストにあるサンプルと比べてパフォーマンスに大きな影響を与えません。あなたは逆方向に反復することができます。

for i in reversed(range(len(time))): 
    if height[i] == 0: 
     del time[i] 
     del height[i] 

要素iを削除する要素0:i-1には影響しませんので、これは動作します。しかし、特に大規模なリストの場合は非常に効率が悪いので、これを行うべきではありません。

また、リストの内包表記を使用して維持するための要素のリストを作成することができます

keep = [i for i,h in enumerate(height) if h != 0] 
time = [time[i] for i in keep] 
height = [height[i] for i in keep] 

これは、それは価値が何のために、これを行うのがより「Python的」な方法かもしれません。

すでにnumpyのを使用している、あなたはあなたのための適切な要素を選択するためにnumpyのを使用する場合があります考える:

import numpy as np 

time = np.array(time) 
height = np.array(height) 

time = time[height != 0] 
height = height[height != 0] 
関連する問題