Comment implémenter un filtre de moyenne mobile efficace à l'aide de Strides ?

Barbara Streisand
Libérer: 2024-10-19 12:19:01
original
790 Les gens l'ont consulté

How to Implement an Efficient Moving Average Filter using Strides?

Utiliser les foulées pour un filtre de moyenne mobile efficace

Dans une discussion précédente, les avantages de l'utilisation des foulées pour des filtres de moyenne mobile efficaces en termes de calcul ont été explorés . Ici, nous approfondissons ce sujet et fournissons une implémentation détaillée.

Filtrage efficace de la moyenne mobile avec les foulées

Pour calculer efficacement un filtre de moyenne mobile à l'aide des foulées, vous pouvez exploitez la fonction as_strided() de numpy.lib.stride_tricks. Cette fonction vous permet de créer une vue d'un tableau qui imite une fenêtre mobile de dimensions spécifiées.

Considérez le code suivant :

<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>
Copier après la connexion

Ici, la fonction as_strided() crée une vue d'un tableau sous la forme d'une série de fenêtres qui se chevauchent, chacune ayant une forme de (100 - filtsize 1, filtsize).

Faire rouler la fenêtre

Pour déplacer la fenêtre , vous pouvez utiliser la fonction 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>
Copier après la connexion

Cela décale la fenêtre de manière itérative en filtrant la taille des colonnes, simulant efficacement le mouvement de la fenêtre sur le tableau d'origine.

Calcul de la moyenne

Pour calculer la moyenne, vous pouvez simplement additionner les valeurs de chaque ligne et diviser par le nombre d'éléments dans le filtre :

<code class="python">filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))</code>
Copier après la connexion

Cela vous donne la moyenne mobile pour chaque pixel du tableau a.

Moyennes mobiles multidimensionnelles

L'approche ci-dessus peut être étendue pour gérer les moyennes mobiles multidimensionnelles à l'aide de la fonction Rolling_window() fournie par 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>
Copier après la connexion

Cette fonction vous permet de créer des vues de fenêtres mobiles le long des axes arbitraires d'un tableau.

Optimisation de la mémoire

C'est important Il convient de noter que même si les astuces de foulée peuvent être efficaces, elles peuvent également entraîner une surcharge de mémoire lorsqu'il s'agit de tableaux multidimensionnels. La fonction scipy.ndimage.uniform_filter() offre une approche alternative qui gère efficacement les moyennes mobiles multidimensionnelles et sans la surcharge de mémoire associée aux astuces de foulée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!