Я нашел scipy.signal.fftconvolve
, , на что также указал магнус , но в то время не осознавал, что он n -мерен. Поскольку он встроен и выдает правильные значения, он кажется идеальным решением.
С Пример 2D свертки :
In [1]: a = asarray([[ 1, 2, 3],
...: [ 4, 5, 6],
...: [ 7, 8, 9]])
In [2]: b = asarray([[-1,-2,-1],
...: [ 0, 0, 0],
...: [ 1, 2, 1]])
In [3]: scipy.signal.fftconvolve(a, b, mode = 'same')
Out[3]:
array([[-13., -20., -17.],
[-18., -24., -18.],
[ 13., 20., 17.]])
Правильно! Версия STSCI, с другой стороны, требует дополнительной работы, чтобы сделать границы правильными?
In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]:
array([[-12., -12., -12.],
[-24., -24., -24.],
[-12., -12., -12.]])
(Метод STSCI также требует компиляции, с которой у меня не получилось (я только что закомментировал части, не относящиеся к Python), есть некоторые ошибки вроде this и изменение входных данных ([1, 2] становится [[1, 2]]) и т. Д. Поэтому я изменил свой принятый ответ на встроенную функцию fftconvolve()
.)
Корреляция, конечно, то же самое, что свертка, но с одним обратным входом:
In [5]: a
Out[5]:
array([[3, 0, 0],
[2, 0, 0],
[1, 0, 0]])
In [6]: b
Out[6]:
array([[3, 2, 1],
[0, 0, 0],
[0, 0, 0]])
In [7]: scipy.signal.fftconvolve(a, b[::-1, ::-1])
Out[7]:
array([[ 0., -0., 0., 0., 0.],
[ 0., -0., 0., 0., 0.],
[ 3., 6., 9., 0., 0.],
[ 2., 4., 6., 0., 0.],
[ 1., 2., 3., 0., 0.]])
In [8]: scipy.signal.correlate2d(a, b)
Out[8]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[3, 6, 9, 0, 0],
[2, 4, 6, 0, 0],
[1, 2, 3, 0, 0]])
и последняя версия была ускорена благодаря внутреннему использованию размеров двух степеней (а затем я увеличил ее на , используя реальное БПФ для реального ввода и использование 5-гладких длин вместо степеней 2 : D).