ホームページ >バックエンド開発 >Python チュートリアル >ストライドを使用して効率的な移動平均フィルターを実装するにはどうすればよいですか?

ストライドを使用して効率的な移動平均フィルターを実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-19 12:19:01864ブラウズ

How to Implement an Efficient Moving Average Filter using Strides?

効率的な移動平均フィルターにストライドを使用する

前の説明では、計算効率の高い移動平均フィルターにストライドを使用する利点について検討しました。 。ここでは、このトピックをさらに掘り下げ、詳細な実装を提供します。

ストライドを使用した効率的な移動平均フィルタリング

ストライドを使用して移動平均フィルターを効率的に計算するには、次のようにします。 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。