2010-11-02 27 views
3

J'ai une grande matrice, 4000x4000 J'ai besoin de calculer la moyenne locale de la fenêtre 11x11 pour chaque x, y de cette matrice En général, il doit être quelque chose commeComment calculer la moyenne locale efficace de chaque coordonnée de grande matrice (filtre moyen) en python

for x in range(4000) 
    for y in range(4000) 
    b[x,y]=mean(a[x-5:x+5,y-5:y+5] 

Mais cela fonctionnera beaucoup de temps est-il une manière plus efficace de le faire? Merci.

+0

Vous ne voulez pas faire ce calcul en code Python. numpy peut probablement le faire, mais leur page est inutilement lente pour le moment. –

+0

Avez-vous essayé d'utiliser xrange? De combien d'efficacité avez-vous besoin? –

Répondre

3

Vous pouvez utiliser une technique de programmation dynamique pour le rendre beaucoup plus rapide. Prétraitez la matrice en commençant le coin supérieur gauche et en vous déplaçant de gauche à droite, puis de haut en bas, en définissant chaque cellule comme la somme de sa valeur et celle ci-dessus (si elle existe) et celle de gauche (si elle existe) . Quand vous arrivez à la fin, la valeur en bas à droite devrait être la somme totale de la matrice entière.

for x in xrange(4000): 
    for y in xrange(4000): 
     c[x,y] = a[x,y] 
     if x > 0: 
      c[x,y] += c[x-1,y] 
     if y > 0: 
      c[x,y] += c[x,y-1] 

et maintenant vous pouvez obtenir la somme de n'importe quelle région rectangulaire en soustrayant le coin supérieur gauche en haut à droite: par ex. dans ce cas, la somme de la région de 11x11 sera

c[x+5,y+5]-c[x-5,y-5] 

Ensuite, vous pouvez simplement diviser par la taille de la fenêtre pour obtenir la moyenne locale:

b[x,y] = (c[x+5+,y+5]-c[x-5,y-5])/121 

Maintenant, au lieu de itérer sur 121 points pour chaque élément de la matrice, il suffit de faire 2 passes sur la matrice sans itération pour chaque élément.