2017-01-31 7 views
1

通報連続信号で無効な値を見つける方法は?

私が配列周期に対して同じ値を持つ値がフリーズインデックスを特定する必要があり、いくつかの浮動小数点の配列を有します。

x = np.linspace(0, 30, 1000) 
y1 = np.sin(x) 
y2 = np.sin(x) 
# Introduce some errors! 
y2[ (x>5)&(x<=8) ] = -0.2 
y2[ (x>15)&(x<=16) ] = -1 
y2[ (x>16)&(x<17) ] = 1 

y1y2次のようになります。

enter image description here

そして、私はそれらの水平線がどこにあるか知りたいです。


私は

  • ループしようとしている:私はfor前に、ウィンドウの長さを定義することができます...しかし、それはのように不器用な感じもちろん

    error = np.zeros_like(y2) 
    for i in range(1,y2.shape[-1]-1): 
        if y2[i-1] == y2[i] == y2[i+1]: 
         error[i-1] = 1 
         error[i] = 1 
         error[i+1] = 1 
    

を私はいくつかのネストされたループを、列と期間ごとに用意しています。

  • np.diff→ここでの問題は、派生物が単独で0であることがあることです。また、信号が非常にゆっくり(温度)変化するので、ループ内の隣接する(ゼロ)値を再度チェックすることになります。

  • 私はいくつかのインデックス作成を探し始めました:y2[ where(y2==previous(y2) & y2 == next(y2) ]、これまで成功していません。これは今私が試しているもので、pandas.DataFrameです。

私は水平線が表示され、インデックスのいずれかを持ちたい、または多分np.nanでそれらを置き換えます。私はまた、ウィンドウの幅(ほとんどの場合、最終的に約10の値になります)で少し再生することができる必要があります。

アイデア?


コンテキスト

私が実際に持っていることは、私は記録時間のタイムスタンプと一緒に浮動小数点値を取得した温度測定とpandas.DataFrame、です。時にはエラーが "フリーズ"していると測定の代わりに直線を与える。ときにはそれが最後に繰り返された測定であることもありますが、時にはそれは単なるランダムな値です。各センサーが故障したときを知る必要があります。もちろん、失敗の持続時間は毎回異なります。各信号の長さは約30,000エレメントです。


使用方法:python 3.5.2 numpy 1.11.1 pandas 0.18。1

+1

ような何かを行うことができませんか?これは公差パラメータ 'rtol'を持っています:https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.isclose.html – EdChum

+0

誤った値はまったく同じです、' isclose() '多くの偽陽性を投げるだろう。 – Luis

+1

質問には関係ありません。FYI: 'y2 [np.ma.masked_where((x> 5)&(x <= 8)、y2).mask] = -0.2'は' y2 [ > 5)&(x≦8)] = - 0.2 'である。 –

答えて

2

は、あなただけの `np.isclose(np.diff(Y2)、0)`についてどのように

dy2 = np.r_[1, np.diff(y2).astype(bool).astype(int), 1] 
bnds = np.diff(dy2) 
starts = np.where(bnds == -1)[0] 
stops = np.where(bnds == 1)[0] + 1 
keep = stops >= starts + min_length 
starts = starts[keep] 
stops = stops[keep] 
+0

データ型と 'diff'の素晴らしいトリックです!私はそれを関数にパックし、すでにそれを使用しています、ありがとう! :) – Luis

+0

ところで、私は最後に2行を追加しました。(参考のために) 'error = np.zeros_like(array)' 'a、bのzip(開始、停止): ' 'エラー[a :b] = 1' 'assert error.shape == array.shape' ' return error' – Luis

+1

よろしくお願いします。ところで、あなたは境界が正確であることを確認しましたか?私は100%確実ではありませんでした。私の勘違いは、ストップが一点になるかもしれないことです。 –

関連する問題