ホームページ >バックエンド開発 >Python チュートリアル >ストライドを使用して効率的な移動平均フィルターを実装するにはどうすればよいですか?
効率的な移動平均フィルターにストライドを使用する
前の説明では、計算効率の高い移動平均フィルターにストライドを使用する利点について検討しました。 。ここでは、このトピックをさらに掘り下げ、詳細な実装を提供します。
ストライドを使用した効率的な移動平均フィルタリング
ストライドを使用して移動平均フィルターを効率的に計算するには、次のようにします。 numpy.lib.stride_tricks の as_strided() 関数を利用します。この関数を使用すると、指定した次元の移動ウィンドウを模倣する配列のビューを作成できます。
次のコードを考えてみましょう:
<code class="python">filtsize = 3 a = numpy.arange(100).reshape((10,10)) b = numpy.lib.stride_tricks.as_strided(a, shape=(a.size,filtsize), strides=(a.itemsize, a.itemsize))</code>
ここでは、as_strided() 関数がビューを作成します。それぞれ (100 - filtsize 1, filtsize) の形状を持つ、一連の重なり合うウィンドウとしての配列の配列。
ウィンドウのローリング
ウィンドウを移動するにはnumpy.roll() 関数を使用できます。
<code class="python">for i in range(0, filtsize-1): if i > 0: b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)</code>
これは、filtsize 列ごとにウィンドウを繰り返しシフトし、元の配列上でのウィンドウの動きを効果的にシミュレートします。
平均の計算
平均を計算するには、各行の値を単純に合計し、フィルター内の要素の数で割ります。
<code class="python">filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))</code>
これにより、次のようになります。配列内の各ピクセルの移動平均。
多次元移動平均
上記のアプローチは、提供されている rolling_window() 関数を使用して多次元移動平均を処理するように拡張できます。 by numpy:
<code class="python">def rolling_window(a, window): shape = a.shape[:-1] + (a.shape[-1] - window + 1, window) strides = a.strides + (a.strides[-1],) return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)</code>
この関数を使用すると、配列の任意の軸に沿って移動ウィンドウ ビューを作成できます。
メモリの最適化
重要ですストライド トリックは効率的ですが、多次元配列を扱う場合にはメモリのオーバーヘッドが発生する可能性があることに注意してください。 scipy.ndimage.uniform_filter() 関数は、ストライド トリックに伴うメモリ オーバーヘッドを発生させずに、多次元移動平均を効率的に処理する代替アプローチを提供します。
以上がストライドを使用して効率的な移動平均フィルターを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。