1

次のようなデータセットがあります (1D python リスト):

[0,0,0,0,4,5,6,6,4,0,0,0,0,0,0,2,0,0,0,6,4,5,6,0,0,0,0,0]

前のウィンドウに基づいて、バリエーションのカットオフ ポイントを見つけようとしています。

次の出力を探しています:

[4, 9, 19, 23]

ウィンドウが少なくとも 3 である必要があると仮定すると、変動は少なくとも 3 つの連続する要素とデータ内のノイズに対して発生する必要があります。

  • 少なくとも 2 つの要素でウィンドウを埋める
  • 標準偏差を計算し、stddev 内にある後続のすべてのポイントをそのウィンドウに追加します。新しいポイントを追加するたびに再計算します。
  • ポイントが stddev の外側にある場合 (ここでは例として、4 の最初の出現)、次のポイントも stddev の外側にあることを確認し (5 の最初の出現)、そうであれば、最初の逸脱ポイント ( 4はこちら)。そうでない場合は、現在のウィンドウに追加し続けます。
  • 新しい「逸脱」値は、比較対象のウィンドウになり、繰り返します。

これを行うためのより良い方法、または組み込みの numpy 関数はありますか?

ありがとう。

編集

@qwwqwwq によって提案された解決策はうまく機能しますが、別の小さな制約があります。リストの値が同じ重みを持っていないことに気付きました。この新しいデータセットを仮定すると:

[(10, 0), (20, 0), (15, 0), (20, 0), (8, 4), (10, 5), (15, 6), (15, 6), (10, 4), (5, 0),(5, 0), (20, 0), (10, 0), (8, 0),(5, 0), (10, 2), (5, 0), (5, 0), (5,0), (10,6) ,(5, 4), (5,5), (10, 6), (10, 0),(10,0) ,(10,0) ,(10,0) ,(10,0)]
  • pos 0 は秒単位の期間です
  • pos 1 は私の値です
  • ピークを考慮する最小時間は 30 秒です

widths = np.array([2]最小時間に置き換えるにはどうすればよいですか?

を取りslope_down_begin_points、最も近いものslope_down_begin_pointsを確認し、2 つの間のポイントの持続時間の合計が > 最小時間であるかどうかを確認できます。私は にあまり詳しくありませんsignal。うまくいけば、もっと良いものがありますか?

編集 2

これを行うもう 1 つの単純で素朴な方法は、>0 の値をグループ化し、[0] と [-1] の値をエッジとして切り出すことです。

for k, g in groupby(x, key=lambda v: v[1] == 0):
    print k,g
    group = list(g)
    # only consider if long enough
    if sum([z[0] for z in group]) > some_minumum_time:
        # do stuff
4

1 に答える 1