3

それとも、このような真の反復アルゴリズムはベクトル化できないのでしょうか?

■ += の使用法は cumsum でベクトル化できますが、合計の下限には問題があります。

ラグやシフトを使用する素晴らしい方法はありますか?

s = 0
for (time, usage) in timeseries:
    s += usage
    s = max(s-rate, 0)
    new_timeseries[time] = s

私はしばらくそれをこじ開けましたが、何も思いつきませんでした。

4

1 に答える 1

1

timeseries最初に配列に入れます。timeseriesの値がであると仮定しましょうmy_array。それで、

import numpy as np
s = np.cumsum(my_array) - rate
s[s < 0] = 0
new_timeseries = s 

更新:これは正しくありません。増分がレートを下回るcumsum場合、ゼロ化は考慮されません。導関数を使用して、 がレートを下回っsている点を見つけることができます。cumsum

In [1]: dd = np.diff(np.cumsum(my_array))
In [2]: dd < rate
Out[3]: array([ True, False, True, False, False, True, True,  
                True, True, False, True, False, True, False,
                True, True, True, False, False], dtype=bool)

ただし、これは を「リセット」しませんcumsum。これらのインデックスを探してcumsum「Trues」のブロックを実行することもできますが、ループよりも効率的かどうかはわかりません。

于 2012-12-13T03:15:18.900 に答える