Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann die Implementierung des gleitenden Durchschnittsfilters mit Stride-Tricks verbessert werden?

Wie kann die Implementierung des gleitenden Durchschnittsfilters mit Stride-Tricks verbessert werden?

Susan Sarandon
Susan SarandonOriginal
2024-10-19 10:02:30232Durchsuche

How to Enhance Moving Average Filter Implementation with Stride Tricks?

Verwendung von Stride-Tricks für eine effiziente Implementierung von gleitenden Durchschnittsfiltern

Diese Untersuchung untersucht die Verwendung von Stride-Tricks, um einen effizienteren gleitenden Durchschnittsfilter zu entwickeln als die in einem früheren Beitrag beschriebene faltungsbasierte Methode. Das Ziel besteht darin, große Gleitkomma-Arrays für Aufgaben zu filtern, bei denen scipy.ndimage.filters.convolve relativ langsam ist.

Der ursprüngliche Ansatz nutzte Stride-Tricks, um eine Reihe von Arrays zu generieren, die den oberen, mittleren und unteren Bereich darstellen Zeilen eines 3x3-Filterkernels. Diese Arrays wurden dann summiert und gemittelt, um die Filterausgabe für jedes Pixel zu erzeugen. Der Fragesteller suchte jedoch nach einer effizienteren Methode, mit der die Summe oder die einzelnen Werte der Kernelelemente für das gesamte Array direkt ermittelt werden könnten.

Verbesserter Ansatz mithilfe multidimensionaler Stride-Tricks

Die erweiterte Lösung beinhaltet die Anwendung multidimensionaler Schritttricks, um eine Ansicht des ursprünglichen Arrays zu erstellen, in der jedes Element ein bewegliches Fenster der gewünschten Größe darstellt. Dies ermöglicht die mehrfache Anwendung einer beliebigen Funktion auf die letzte Achse und die effektive Berechnung des gleitenden Durchschnitts oder anderer gewünschter statistischer Maße über ein Schiebefenster.

Codebeispiel

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

def rolling_window(array, window):
    """Multidimensional moving window function"""
    # Validate window dimensions
    if not hasattr(window, '__iter__'):
        return rolling_window_lastaxis(array, window)
    for i, win in enumerate(window):
        if win > 1:
            array = array.swapaxes(i, -1)
            array = rolling_window_lastaxis(array, win)
            array = array.swapaxes(-2, i)
    return array

filtsize = (3, 3)
array = np.arange(100).reshape((10, 10))
windowed_array = rolling_window(array, filtsize)
blurred_array = windowed_array.mean(axis=-1).mean(axis=-1)</code>

Vorteile der erweiterten Lösung

  • Direkte Generierung des beweglichen Fensters mithilfe von Stride-Tricks, wodurch Zwischenschritte entfallen.
  • Anwendbarkeit auf mehrdimensionale Arrays, was ermöglicht für eine effiziente Filterung entlang mehrerer Achsen.
  • Vektorisierung von beweglichen Fensteroperationen, was zu einer deutlich reduzierten Rechenzeit führt.

Einschränkungen

Trotzdem Vorteile bietet, ist es wichtig zu beachten, dass die Verwendung von Stride-Tricks für mehrdimensionale bewegliche Fenster zu einer erhöhten Speichernutzung führen kann. Daher sollten die verfügbaren Ressourcen und die Größe des Eingabearrays sorgfältig berücksichtigt werden.

Vergleich mit scipy.ndimage

Während Stride-Tricks Flexibilität und Vorteile bei der Vektorisierung bieten scipy.ndimage-Funktionen sind im Allgemeinen speichereffizienter und für mehrdimensionale Bildverarbeitungsaufgaben optimiert. Für große Arrays wird scipy.ndimage.uniform_filter als schnellere und robustere Option zum Anwenden von gleitenden Durchschnittsfiltern empfohlen.

Das obige ist der detaillierte Inhalt vonWie kann die Implementierung des gleitenden Durchschnittsfilters mit Stride-Tricks verbessert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn