Per quanto ho visto, questi metodi sono entrambi implementati come funzioni C nelle rispettive DLL e sembra che la versione ndimage
sia più veloce (nessuna implementazione usa codice parallelizzato, come le chiamate a blas o MKL).Qual è la differenza tra scipy.ndimage.filters.convolve e scipy.signal.convolve?
Inoltre, quando ho provato a verificare che restituiscano gli stessi risultati eseguendo il seguente codice, l'asserzione di uguaglianza non è riuscita. Non sono riuscito a capire dalla documentazione quali sarebbero esattamente le differenze funzionali tra i due metodi (la documentazione non è molto chiara su cosa sia 0
in relazione alla posizione dell'origine del kernel, dagli esempi, ho dedotto che è nel centro, ma potrei sbagliarmi).
from numpy import random, allclose
from scipy.ndimage.filters import convolve as convolveim
from scipy.signal import convolve as convolvesig
a = random.random((100, 100, 100))
b = random.random((10,10,10))
conv1 = convolveim(a,b, mode = 'constant')
conv2 = convolvesig(a,b, mode = 'same')
assert(allclose(conv1,conv2))
Grazie!
Non conosco le implementazioni, ma probabilmente l'implementazione da ndimage utilizza il teorema della convoluzione, cioè la convoluzione è uguale alla moltiplicazione nello spazio di Fourier. Questo è ciò che scipy.signal.fftconvolve fa. Ma anche quando si usa questo metodo invece di convolve, l'asserzione fallisce. –
Mi sembra che entrambi stiano usando le implementazioni dirette. Credo che il codice che viene chiamato alla fine sia [qui] (https://github.com/scipy/scipy/blob/master/scipy/signal/correlate_nd.c.src#L105) e [qui] (https : //github.com/scipy/scipy/blob/master/scipy/ndimage/src/ni_filters.c#L132), rispettivamente. Ho provato a chiamare i metodi su array interi per escludere errori di arrotondamento ecc., Ma l'asserzione fallisce pure. – bbudescu
L'asserzione fallisce anche sugli array 2d, ma solo se il kernel è maggiore di una certa dimensione, ad es. 'a = random.random_integers (0,10, (100, 100)); b = random.random_integers (0,10, (7, 7))' non fallisce, ma quando 'b = random.random_integers (0 , 10, (8, 8)) ', lo fa. qualche idea? – bbudescu