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.
Vous ne voulez pas faire ce calcul en code Python. numpy peut probablement le faire, mais leur page est inutilement lente pour le moment. –
Avez-vous essayé d'utiliser xrange? De combien d'efficacité avez-vous besoin? –