6

問題は、プロットと分析のデータ量を減らしたいことです。Python と Numpy を使用しています。データは不均等にサンプリングされるため、タイムスタンプの配列と対応する値の配列があります。データポイント間に少なくとも一定の時間が必要です。ここでは、サンプル間に少なくとも 1 秒ある場所にインデックスが見つかる、Python で書かれた簡単なソリューションがあります。

import numpy as np

t = np.array([0, 0.1, 0.2, 0.3, 1.0, 2.0, 4.0, 4.1, 4.3, 5.0 ]) # seconds
v = np.array([0, 0.0, 2.0, 2.0, 2.0, 4.0, 4.0, 5.0, 5.0, 5.0 ])

idx = [0]
last_t = t[0]
min_dif = 1.0 # Minimum distance between samples in time
for i in range(1, len(t)):
    if last_t + min_dif <= t[i]:
        last_t = t[i]
        idx.append(i)

結果を見ると:

--> print idx
[0, 4, 5, 6, 9]

--> print t[idx]
[ 0.  1.  2.  4.  5.]

問題は、特に配列が非常に長い場合、これをより効果的に行うにはどうすればよいかということです。同様のことを行う NumPy または SciPy メソッドに組み込まれているものはありますか?

4

4 に答える 4

4

@ 1443118 のように、 を使用することをお勧めしますpandasが、 で何かを試してみることをお勧めしますnp.histogram

まず、必要なビンの数 ( min_difs の間隔) を把握します。

>>> bins = np.arange(t[0], t[-1]+min_dif, min_dif) - 1e-12

これt[-1]+min_difは、最後のポイントを確実に取得することです。これは、最後のビンで例がカウントされ-1e-12ないようにするためのハック4.0です。これは、右側の間隔を確実に閉じるための単なるオフセットです。

>>> (counts, _) = np.histogram(t, bins)
>>> counts
array([4, 1, 1, 0, 3])
>>> counts.cumsum()
array([4, 5, 6, 6, 9])

それで、v[0:4]あなたの最初のサンプルですか、v[4:5]あなたの2番目のサンプルですか...あなたはアイデアを得ます.

于 2012-08-23T13:11:43.383 に答える
3

numpy.interp簡単な解決策は、たとえば:を使用した補間によるものです。

vsampled = numpy.interp(numpy.arange(t[0], t[-1]), t, v)

ただし、これでは値のインデックスは提供されません。ただし、入力配列のデータが利用できないtのポイントについても、補間によって値が生成されます。

于 2012-08-21T13:46:21.607 に答える
1

これにはパンダを使用することをお勧めします。一定間隔の時系列を生成してから、特定の頻度にデータをリサンプリングするのは非常に簡単です。これを参照 して、ページの約半分のリサンプリングに関するサブセクションを見てください。

于 2012-08-21T15:12:25.350 に答える
1

あなたが望むものを正確に実行するソリューションは考えられませんが、私にはあまりにもエレガントに思えませんが、これは補間を行わずにほぼあなたが望むことを行うはずです。毎秒、最大で 1 つの値 (左端) が得られます。

# Assuming that t is sorted...
# Create all full seconds.
seconds = np.arange(int(t[0]), int(t[-1]) + 1)

# find the indexes for all
idx = np.searchsorted(t, seconds)
idx = np.unique(idx) # there might be duplicates if a second has no data in it.

あなたの例では同じ結果が得られますが、通常はもちろん、より小さなまたはより大きな違いが許容されます(0〜2秒の間の任意のもの)...

于 2012-08-21T14:26:27.093 に答える