ホームページ >バックエンド開発 >Python チュートリアル >高度なストライディングは移動平均フィルターの効率をどのように向上させることができますか?

高度なストライディングは移動平均フィルターの効率をどのように向上させることができますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-19 10:28:021071ブラウズ

How Can Advanced Striding Enhance the Efficiency of Moving Average Filters?

高度なストライディングを使用したより効率的な移動平均フィルター

概要:

移動の計算大規模なデータセットに対する平均フィルターは、計算コストが高くなる可能性があります。畳み込みフィルターを使用した標準的な実装は低速になる可能性がありますが、高度なストライディング手法はより効率的なソリューションを提供します。

提案された手法:

提案された手法には、NumPy の stride_tricks.as_strided( ) 関数を使用して、元の配列上の移動ウィンドウに対応する配列を作成します。この配列を垂直方向と水平方向にローリングすることで、カーネル値を効率的に合計して各ピクセルの平均を計算できます。

実装:

次のコードは、次のコードの実装を示します。この手法:

<code class="python">import numpy as np

filtsize = 3
a = numpy.arange(100).reshape((10,10))
b = np.lib.stride_tricks.as_strided(a, shape=(a.size,filtsize), strides=(a.itemsize, a.itemsize))
for i in range(0, filtsize-1):
    if i > 0:
        b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)
filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))</code>

利点:

この手法には、従来の畳み込みフィルタに比べていくつかの利点があります:

  • メモリ効率: as_strided 配列は元の配列へのビューであるため、データセット全体を新しい配列にコピーする必要はありません。
  • 計算効率: ローリング演算と合計演算により、 NumPy の最適化された関数を使用して効率的に実行できます。
  • カスタマイズ可能なカーネル サイズと形状: filtsize パラメーターを使用すると、フィルターのサイズと形状を簡単に調整できます。

制限事項:

  • エッジ処理: 提案された手法はエッジ ピクセルを正しく処理しません。この問題に対処するには、後処理手順が必要になる場合があります。
  • 多次元配列: この手法は 1 次元配列に最適です。多次元配列の場合、メモリ使用量と計算コストが法外に高くなる可能性があります。

代替アプローチ:

  • Numba JIT コンパイル: Just-in-時間コンパイルにより、この手法のパフォーマンスをさらに向上させることができます。
  • SciPy の ndimage モジュール: 多次元配列の場合、SciPy のuniform_filter() 関数は、より効率的で包括的なソリューションを提供します。

以上が高度なストライディングは移動平均フィルターの効率をどのように向上させることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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