Вы можете использовать метод динамического программирования, чтобы сделать его во много раз быстрее. Предварительно обработайте матрицу, запустив верхний левый угол и двигаясь слева направо, затем сверху вниз, установив каждую ячейку равной сумме ее значения, одну выше (если она существует) и одну слева (если она существует) , Когда вы дойдете до конца, нижнее правое значение должно быть общей суммой всей матрицы.
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 прохода по матрице без итераций для каждого элемента.