Вы можете использовать метод динамического программирования, чтобы сделать это много раз быстрее. Предварительно обработайте матрицу, запустив верхний левый угол и перемещаясь влево-вправо, затем сверху вниз, устанавливая каждую ячейку как сумму ее значения и одну выше (если она существует), и одну влево (если она существует) , Когда вы дойдете до конца, нижнее правое значение должно быть общей суммой всей матрицы.
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]
и теперь вы можете получить сумму любой прямоугольной области, вычтите верхний левый угол из верхнего права: напр. в этом случае, сумма области 11x11 будет
c[x+5,y+5]-c[x-5,y-5]
Тогда вы можете просто разделить по размеру окна, чтобы получить местное среднее:
b[x,y] = (c[x+5+,y+5]-c[x-5,y-5])/121
Теперь вместо перебора более 121 точек для каждого элемента в матрице вам нужно сделать только 2 прохода над матрицей без итераций для каждого элемента.
Вы не хотите делать это вычисление в коде Python. numpy, возможно, это сделает, но на данный момент их страница неэффективна. –
Вы пробовали использовать xrange? Насколько вам больше нужна эффективность? –