Поиск шаблона в 2d массиве с помощью numpy

#numpy #matrix

Вопрос:

У меня есть массив из 1 и нулей, называемый a. например:

 a= 
[[0,0,1,1,1,0],
[0,0,0,0,0,0],
[1,0,0,0,0,1],
[0,0,0,0,1,0],
[0,0,0,1,0,0],
[0,0,1,0,0,1]]
 

и ядро (k):

 k =
[[0,0,1]
[0,1,0]
[1,0,0]]
 

Я хочу найти все экземпляры k внутри a.
Я хочу, чтобы результат свертки был:

 conv(a,k) = 
    [[0,0,0,0,0,0],
    [0,0,0,0,0,0],
    [0,0,0,0,0,0],
    [0,0,0,0,1,0],
    [0,0,0,1,0,0],
    [0,0,0,0,0,0]]
 

Есть ли встроенная функция?

Я знаю, что это можно сделать с помощью циклов for, но это слишком медленно для больших массивов. Тнх

Комментарии:

1. Если вас устраивает scipy, у него есть метод свертки: docs.scipy.org/doc/scipy/reference/generated/…

Ответ №1:

Можно применить свертку с помощью numpy.fft

Код от: https://laurentperrinet.github.io/sciblog/posts/2017-09-20-the-fastest-2d-convolution-in-the-world.html#using-directly-numpy

 from numpy.fft  import fft2, ifft2
def np_fftconvolve(A, B):
    return np.real(ifft2(fft2(A)*fft2(B, s=A.shape)))