2010-11-02 3 views
3

У меня есть большая матрица, 4000x4000 мне нужно вычислить местное среднее 11x11 окна для каждого х, у этой матрицы Вообще она должна быть что-то вродеКак рассчитать эффективное местное среднее каждой координаты большой матрицы (средний фильтр) в Python

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

Но это будет работать много времени Является ли это какой-то более эффективный способ сделать это? Спасибо.

+0

Вы не хотите делать это вычисление в коде Python. numpy, возможно, это сделает, но на данный момент их страница неэффективна. –

+0

Вы пробовали использовать xrange? Насколько вам больше нужна эффективность? –

ответ

3

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

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 прохода над матрицей без итераций для каждого элемента.