Maison  >  Article  >  développement back-end  >  Comment implémenter un filtre de moyenne mobile efficace à l'aide de Strides ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-19 12:19:01791parcourir

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>

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>

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>

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>

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!

Déclaration:
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