Векторизация 2D-сверток в NumPy - PullRequest
1 голос
/ 18 июня 2020

Я знаю, что для выполнения 2D-сверток доступны различные оптимизированные стандартные функции, но просто для понимания я пытаюсь реализовать свою собственную функцию 2D-свертки.

На данный момент я сделал следующее:

    convoluted = []
    # TODO: Vectorize
    for i in range(0, M - m + 1):
        for j in range(0, N - n + 1):
            submatrix = x[i:i+m, j:j+n]
            convoluted.append(np.sum([submatrix*kernel]))
    convoluted = np.array(convoluted).reshape(M - m + 1, N - n + 1)

Обратите внимание, что x - это массив входного изображения, (M, N) - это форма входного изображения, а (m, n) это форма используемого ядра.

2 явных цикла for довольно медленные.
Есть ли способ векторизовать это? Любая помощь приветствуется
(я знаю, что понимание списка python можно использовать, по крайней мере, для внутреннего l oop, но я ищу более быстрый метод, если таковой имеется)

1 Ответ

1 голос
/ 18 июня 2020

Думаю, вы ищете это:

from skimage.util.shape import view_as_windows
sub_matrices = view_as_windows(x, (m,n), 1)
convoluted = np.einsum('ij,klij->kl',kernel,sub_matrices)

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

Другой аналогичный подход без использования пакета skimage (с использованием только numpy, но немного более длинного кода) - здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...