Как выполнить пул по Гауссу для двумерного массива, используя numpy - PullRequest
0 голосов
/ 19 февраля 2020

Учитывая 2D (M x N) матрицу и 2D гауссовскую маску (K x K), как мне вернуть матрицу, которая является результатом объединения Гаусса с использованием данного ядра над изображением?

Я хотел бы использовать numpy, если это возможно (не используя "for", используйте только numpy), например, из пула 2x2 Гаусса: (Это может быть неправильный ответ)

matrix:
array([[  20,  200,   -5,   23,  10, -50],
       [ -13,  134,  119,  100,  45, -79],
       [ 120,   32,   49,   25,  13,   0],
       [  40,   12,   59,   23,  32,  -1],
       [  75,  121,   69,   67,  64,  -7],
       [  39,   12,   79,   -8,  16,  -9]])
kernel:
array([[ 1/16, 1/8, 1/16],
       [  1/8, 1/4,  1/8],
       [ 1/16, 1/8, 1/16]])
soln:
array([[   87.25,   16.625],
       [ 64.8125,  29.8125]])

1 Ответ

0 голосов
/ 19 февраля 2020

Сначала преобразуйте матрицу M x N в массив (M // K) x K x (N // K) x K, затем поточечно умножьте на ядро ​​во втором и четвертом измерениях, затем суммируйте во втором и четвертое измерение.

np.sum(
    matrix.reshape((
        matrix.shape[-2] // kernel.shape[-2], kernel.shape[-2],
        matrix.shape[-1] // kernel.shape[-1], kernel.shape[-1],
    ))
    * kernel[np.newaxis, :, np.newaxis, :],
    axis=(-3, -1),
)

Вы также можете заменить точечное умножение на сумму на np.tensordot вызов.

np.tensordot(
    matrix.reshape((
        matrix.shape[-2] // kernel.shape[-2], kernel.shape[-2],
        matrix.shape[-1] // kernel.shape[-1], kernel.shape[-1],
    )),
    kernel,
    axes=(
        (-3, -1),
        (-2, -1),
    )
)
...