5

数年間、6時間ごとの時系列を含む3D(時間、X、Y)のnumpy配列があります。(たとえば5)。次のように、利用可能なレコード(1日あたり5つの可能性)からランダムに取得された各暦日の1つのインスタンスを含むサンプル時系列を作成したいと思います。

  • 2006年1月1日
  • 2011年1月2日
  • 2009年1月3日
  • ..。

これは、2006年1月1日から4つの値、2011年2月1日から4つの値などを取得する必要があることを意味します。次のように機能する作業バージョンがあります。

  • 入力配列の形状を変更して、「年」のディメンション(Time、Year、X、Y)を追加します
  • 0から4までのランダムに生成された整数の365値配列を作成します
  • np.repeatと整数の配列を使用して、関連する値のみを抽出します。

例:

sampledValues = Variable[np.arange(numberOfDays * ValuesPerDays), sampledYears.repeat(ValuesPerDays),:,:]

これはうまくいくようですが、これが私の問題を解決するための最良/最速のアプローチであるかどうか疑問に思いましたか?私はこれをループで行っているので、速度は重要です。adnは、できるだけ多くのケースをテストすることでメリットが得られます。

私はこれを正しくやっていますか?

ありがとう

編集 うるう年の2月29日を削除するために、入力データセットをフィルタリングしたことを忘れました。

基本的に、その操作の目的は、平均などの点で長期時系列によく一致する365日のサンプルを見つけることです。サンプリングされた時系列が品質テストに合格した場合は、エクスポートしてやり直したいと思います。

4

2 に答える 2

3

2008年は366日だったので、形を変えないでください。

scikits.timeseriesをご覧ください:

import scikits.timeseries as ts

start_date = ts.Date('H', '2006-01-01 00:00')
end_date = ts.Date('H', '2010-12-31 18:00')
arr3d = ... # your 3D array [time, X, Y]

dates = ts.date_array(start_date=start_date, end_date=end_date, freq='H')[::6]
t = ts.time_series(arr3d, dates=dates)
# just make sure arr3d.shape[0] == len(dates) !

tこれで、日/月/年のオブジェクトを使用してデータにアクセスできます。

t[np.logical_and(t.day == 1, t.month == 1)]

たとえば、次のようになります。

for day_of_year in xrange(1, 366):
    year = np.random.randint(2006, 2011)

    t[np.logical_and(t.day_of_year == day_of_year, t.year == year)]
    # returns a [4, X, Y] array with data from that day

tうるう年でも機能するように、の属性を試してみてください。

于 2011-10-21T12:11:01.227 に答える
0

サンプリング プロセスに年サイズの情報を埋め込み、配列を元の形状のままにしておくことができるため、配列を再形成する必要はないと思います。

たとえば、ランダムなオフセット (0 から 365 まで) を生成し、インデックス付きのスライスを選択できますn*365 + offset

とにかく、私はあなたが何をする必要があるか、またはその理由をよく理解していなかったので、あなたの質問は完全ではないと思います.

于 2011-10-21T12:34:12.443 に答える