ho trovato scipy.signal.fftconvolve
, as also pointed out by magnus, ma non mi rendevo conto al momento che si tratta di n dimensionale. Poiché è integrato e produce i giusti valori, sembra la soluzione ideale.
Da Example of 2D Convolution:
corretta! La versione STSCI, d'altra parte, richiede un lavoro extra per rendere i confini corretti?
In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]:
array([[-12., -12., -12.],
[-24., -24., -24.],
[-12., -12., -12.]])
(Procedimento STScI richiede inoltre la compilazione, che ero riuscita con (I appena commentato le parti non pitone), ha alcuni insetti come this e modificando gli ingressi ([1, 2] diventa [[ 1, 2]]), ecc Così ho cambiato la mia risposta accettata alla correlazione built-in funzione di fftconvolve()
)
, naturalmente, è la stessa cosa di convoluzione, ma con un ingresso invertito:.
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]])
e the latest revision sono stati velocizzati usando le due dimensioni di alimentazione interna (e poi l'ho accelerato di più con using real FFT for real input e using 5-smooth lengths instead of powers of 2: D).
nota che mediante il calcolo esatto (senza FFT) è esattamente la stessa dicendo che è lento :) Più precisamente, il metodo basato su FFT sarà molto più veloce se avete un segnale e un kernel approssimativamente della stessa dimensione (se il kernel è molto più piccolo dell'input, allora FFT potrebbe essere effettivamente più lento del calcolo diretto). –
Idealmente, l'algoritmo FFT si prenderà automaticamente cura delle cose di riempimento zero alla giusta dimensione per la migliore velocità. – endolith
Oh non stai parlando di padding zero, stai parlando di abbinare un'immagine 5x5 con un'immagine 2000x2000. Perché l'algoritmo non può solo indovinare se la FFT sarebbe più efficiente e farlo in qualsiasi modo è più veloce? – endolith