Soweit ich gesehen habe, sind diese Methoden beide als C-Funktionen in den jeweiligen DLLs implementiert, und es scheint, dass die ndimage
Version schneller ist (keine Implementierung verwendet parallelisierten Code, wie Aufrufe von Blas oder MKL).Was ist der Unterschied zwischen scipy.ndimage.filters.convolve und scipy.signal.convolve?
Auch wenn ich versuchte zu überprüfen, dass sie die gleichen Ergebnisse durch Ausführen des folgenden Codes zurückgegeben, die Assertion der Gleichheit fehlgeschlagen. Ich konnte aus der Dokumentation nicht herausfinden, was genau die funktionellen Unterschiede zwischen den beiden Methoden sein sollten (die Dokumentation ist nicht sehr klar darüber, was 0
bedeutet relativ zur Position des Ursprungs des Kernels; von Beispielen habe ich abgeleitet, dass es in der Zentrum, aber ich könnte falsch liegen).
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))
Vielen Dank!
Ich kenne die Implementierungen nicht, aber wahrscheinlich verwendet die Implementierung von ndimage den Convolution-Theorem, d. H. Faltung ist gleich Multiplikation im Fourier-Raum. Das ist, was scipy.signal.fftconvolve tut. Aber auch wenn diese Methode verwendet wird, anstatt zu falten, schlägt die Assertion fehl. –
Es scheint mir, dass beide direkte Implementierungen verwenden. Ich glaube, dass der Code, der am Ende aufgerufen wird, [hier] (https://github.com/scipy/scipy/blob/master/scipy/signal/correlate_nd.c.src#L105) und [hier] (https : //github.com/scipy/scipy/blob/master/scipy/ndimage/src/ni_filters.c#L132). Ich habe versucht, die Methoden auf Integer-Arrays aufzurufen, um Rundungsfehler usw. auszuschließen, aber die Assertion schlägt ebenfalls fehl. – bbudescu
Die Assertion schlägt auch auf 2d-Arrays fehl, aber nur, wenn der Kernel größer als eine bestimmte Größe ist, z. 'a = random.random_integers (0,10, (100, 100)); b = random.random_integers (0,10, (7, 7))' scheitert nicht, aber wenn 'b = random.random_integers (0 , 10, (8, 8)) ', tut es. Irgendwelche Gedanken? – bbudescu