4

行と列Xを持つ行列を指定すると、次のようになります。Tk

T = 50
H = 10
k = 5 
X = np.arange(T).reshape(T,1)*np.ones((T,k))

Xラグを使用して行軸に沿ってローリング累積合計を実行する方法はH?

Xcum = np.zeros((T-H,k))
for t in range(H,T):
    Xcum[t-H,:] = np.sum( X[t-H:t,:], axis=0 )

ブロードキャスト/ベクトル化のベスト プラクティスの下で、できればストライドと畳み込みを回避することに注意してください。

4

3 に答える 3

3

次のものが必要なようです。

import scipy.signal
scipy.signal.convolve2d(X, np.ones((H,1)), mode='valid')

これはもちろん畳み込みを使用しますが、前述のように質問は畳み込み演算です。ブロードキャストを行うと、アルゴリズムが大幅に遅くなり、メモリを集中的に使用することになります。

于 2014-08-27T18:38:24.583 に答える
1

実際には、ローリング合計の最後の行が 1 行ありません。これは正しい出力になります。

Xcum = np.zeros((T-H+1, k))
for t in range(H, T+1):
    Xcum[t-H, :] = np.sum(X[t-H:t, :], axis=0)

numpy のみを使用して任意の軸でこれを行う必要がある場合、最も簡単なのはnp.cumsumその軸に沿って a を実行し、その 2 つのスライスの差として結果を計算することです。サンプル配列と軸を使用して:

temp = np.cumsum(X, axis=0)
Xcum = np.empty((T-H+1, k))
Xcum[0] = temp[H-1]
Xcum[1:] = temp[H:] - temp[:-H]

別のオプションは、pandas とそのrolling_sum関数を使用することです。これは、必要に応じて 2D 配列で動作するようです。

import pandas as pd
Xcum = pd.rolling_sum(X, 10)[9:] # first 9 entries are NaN
于 2014-08-27T21:54:37.773 に答える