あなたがそうのように、np.convolve
を使用することができますので、あなたは基本的に、そこに1D convolution
を実行している -
# Get the valid sliding summations with 1D convolution
vals = np.convolve(flat_array,np.ones(n),mode='valid')
# Pad with NaNs at the start if needed
out = np.pad(vals,(n-1,0),'constant',constant_values=(np.nan))
をサンプル実行 -
In [110]: flat_array
Out[110]: array([2, 4, 3, 7, 6, 1, 9, 4, 6, 5])
In [111]: n = 3
In [112]: vals = np.convolve(flat_array,np.ones(n),mode='valid')
...: out = np.pad(vals,(n-1,0),'constant',constant_values=(np.nan))
...:
In [113]: vals
Out[113]: array([ 9., 14., 16., 14., 16., 14., 19., 15.])
In [114]: out
Out[114]: array([ nan, nan, 9., 14., 16., 14., 16., 14., 19., 15.])
1Dコンボリューションの場合は、Scipy's implementation
も使用できます。 Scipyバージョンのランタイムは、大きなウィンドウサイズの方が良いと思われました。次に表示されるランタイムテストも調査を試みます。パフォーマンス向上のためnp.hstack(([np.nan]*(n-1),vals))
: - vals
は次のようになり取得するためのscipyのダウンロード版
from scipy import signal
vals = signal.convolve(flat_array,np.ones(n),mode='valid')
はNaNs
パディング操作はnp.hstack
で置き換えることができます。
ランタイムテスト -
In [238]: def original_app(flat_array,n):
...: sums = np.full(flat_array.shape, np.NaN)
...: for i in range(n - 1, flat_array.shape[0]):
...: sums[i] = np.sum(flat_array[i - n + 1:i + 1])
...: return sums
...:
...: def vectorized_app1(flat_array,n):
...: vals = np.convolve(flat_array,np.ones(n),mode='valid')
...: return np.hstack(([np.nan]*(n-1),vals))
...:
...: def vectorized_app2(flat_array,n):
...: vals = signal.convolve(flat_array,np.ones(3),mode='valid')
...: return np.hstack(([np.nan]*(n-1),vals))
...:
In [239]: flat_array = np.random.randint(0,9,(100000))
In [240]: %timeit original_app(flat_array,10)
1 loops, best of 3: 833 ms per loop
In [241]: %timeit vectorized_app1(flat_array,10)
1000 loops, best of 3: 1.96 ms per loop
In [242]: %timeit vectorized_app2(flat_array,10)
100 loops, best of 3: 13.1 ms per loop
In [243]: %timeit original_app(flat_array,100)
1 loops, best of 3: 836 ms per loop
In [244]: %timeit vectorized_app1(flat_array,100)
100 loops, best of 3: 16.5 ms per loop
In [245]: %timeit vectorized_app2(flat_array,100)
100 loops, best of 3: 13.1 ms per loop
今日の投稿の可能な複製:http://stackoverflow.com/questions/34524808/how-to-apply-a-function-to-each-element-of-an-array-when-the-result-is-依存/ 34527124#34527124 – Netwave
*精度*はどうですか?[1e20,1、-1e20、-1]とn = 3を試してください。 –
@DanielSanchezこの質問は非常に異なるタイプの反復計算に関するものです。これは1Dコンボリューションを実行することになります。 –