Как рассчитать эффективное локальное среднее каждой координаты большой матрицы (средний фильтр) в питоне - PullRequest
3 голосов
/ 02 ноября 2010

у меня большая матрица, 4000x4000 Мне нужно рассчитать локальное среднее 11x11 окна для каждого x, y этой матрицы Обычно это должно быть что-то вроде

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

Но это будет много времени Это более эффективный способ сделать это? Благодарю.

Ответы [ 2 ]

6 голосов
/ 02 ноября 2010

Вы, по сути, хотите двумерную свертку.Scipy может сделать это за вас: http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve2d.html

На самом деле здесь есть аналогичный ответ на SO: 2d свертка с использованием python и numpy

3 голосов
/ 02 ноября 2010

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

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

...