2

面白いパズルがあります。数の多い2D配列があり、各行が測定イベントに対応し、各列が異なる測定変数に対応しているとします。この配列の1つの追加列は、測定が行われた日付を指定します。行はタイムスタンプに従ってソートされます。毎日いくつかの(または多くの)測定があります。目標は、新しい日に対応する行を識別し、その日の後続の行からそれぞれの値を減算することです。

私はこの問題に、何日にもわたってループするループでアプローチし、適切な行を選択するブールベクトルを作成してから、最初に選択した行を減算します。このアプローチは機能しますが、エレガントではないと感じます。これを行うためのより良い方法はありますか?

ほんの小さな例です。以下の線は、最初の列が日で、残りの2つが測定値である行列を定義します。

before = array([[ 1,  1,  2],
   [ 1,  3,  4],
   [ 1,  5,  6],
   [ 2,  7,  8],
   [ 3,  9, 10],
   [ 3, 11, 12],
   [ 3, 13, 14]])

プロセスの最後に、次の配列が表示されることを期待しています。

array([[1, 0, 0],
   [1, 2, 2],
   [1, 4, 4],
   [2, 0, 0],
   [3, 0, 0],
   [3, 2, 2],
   [3, 4, 4]])

PSこの投稿のより良い、より有益なタイトルを見つけるのを手伝ってください。アイデアが足りない

4

1 に答える 1

4

numpy.searchsortedこれには便利な関数です:

In : before
Out:
array([[ 1,  1,  2],
       [ 1,  3,  4],
       [ 1,  5,  6],
       [ 2,  7,  8],
       [ 3,  9, 10],
       [ 3, 11, 12],
       [ 3, 13, 14]])

In : diff = before[before[:,0].searchsorted(x[:,0])]

In : diff[:,0] = 0

In : before - diff
Out:
array([[1, 0, 0],
       [1, 2, 2],
       [1, 4, 4],
       [2, 0, 0],
       [3, 0, 0],
       [3, 2, 2],
       [3, 4, 4]])

長い説明

最初の列を取得してそれ自体を検索すると、それらの特定の値の最小インデックスが得られます。

In : before
Out:
array([[ 1,  1,  2],
       [ 1,  3,  4],
       [ 1,  5,  6],
       [ 2,  7,  8],
       [ 3,  9, 10],
       [ 3, 11, 12],
       [ 3, 13, 14]])

In : before[:,0].searchsorted(x[:,0])
Out: array([0, 0, 0, 3, 4, 4, 4])

次に、これを使用して、インデックス付けによって減算するマトリックスを作成できます。

In : diff = before[before[:,0].searchsorted(x[:,0])]

In : diff
Out:
array([[ 1,  1,  2],
       [ 1,  1,  2],
       [ 1,  1,  2],
       [ 2,  7,  8],
       [ 3,  9, 10],
       [ 3,  9, 10],
       [ 3,  9, 10]])

0減算されないように、最初の列を作成する必要があります。

In : diff[:,0] = 0

In : diff
Out:
array([[ 0,  1,  2],
       [ 0,  1,  2],
       [ 0,  1,  2],
       [ 0,  7,  8],
       [ 0,  9, 10],
       [ 0,  9, 10],
       [ 0,  9, 10]])

最後に、2つの行列を減算して、目的の出力を取得します。

In : before - diff
Out:
array([[1, 0, 0],
       [1, 2, 2],
       [1, 4, 4],
       [2, 0, 0],
       [3, 0, 0],
       [3, 2, 2],
       [3, 4, 4]])
于 2012-07-18T10:14:58.787 に答える