In seguito alla discussione con @Divakar, trova qui sotto un confronto tra i diversi metodi di convoluzione presenti in scipy:
import numpy as np
from scipy import signal, ndimage
def conv2(A, size):
return signal.convolve2d(A, np.ones((size, size)), mode='same')/float(size**2)
def fftconv(A, size):
return signal.fftconvolve(A, np.ones((size, size)), mode='same')/float(size**2)
def uniform(A, size):
return ndimage.uniform_filter(A, size, mode='constant')
Tutti e 3 i metodi restituiscono esattamente lo stesso valore. Tuttavia, notare che uniform_filter
ha un parametro mode='constant'
, che indica le condizioni al contorno del filtro e constant == 0
è la stessa condizione al contorno che viene applicata il dominio di Fourier (negli altri 2 metodi). Per diversi casi d'uso è possibile modificare le condizioni al contorno.
Ora, alcune matrici di prova:
A = np.random.randn(1000, 1000)
e alcune temporizzazioni:
%timeit conv2(A, 3) # 33.8 ms per loop
%timeit fftconv(A, 3) # 84.1 ms per loop
%timeit uniform(A, 3) # 17.1 ms per loop
%timeit conv2(A, 5) # 68.7 ms per loop
%timeit fftconv(A, 5) # 92.8 ms per loop
%timeit uniform(A, 5) # 17.1 ms per loop
%timeit conv2(A, 10) # 210 ms per loop
%timeit fftconv(A, 10) # 86 ms per loop
%timeit uniform(A, 10) # 16.4 ms per loop
%timeit conv2(A, 30) # 1.75 s per loop
%timeit fftconv(A, 30) # 102 ms per loop
%timeit uniform(A, 30) # 16.5 ms per loop
Così, in breve, uniform_filter
sembra più veloce, e perché le convolution is separable in due convolutons 1D (simili a gaussian_filter quali è anche separabile).
Altri filtri non separabili con diversi kernel hanno maggiori probabilità di essere più veloci utilizzando la soluzione signal
(quella in @Divakar).
La velocità di entrambi fftconvolve
e uniform_filter
rimane costante per le diverse dimensioni del kernel, mentre convolve2d
ottiene leggermente più lento.
Non sta funzionando lentamente per me affatto, né sembra che dovrebbe funzionare lentamente. –
@EliSadoff lo sarà se avrò 700 array tutti con forma (7000,7000) ... – Chiefscreation
Non sono sicuro di come farlo in Python ma hai considerato l'elaborazione multi-threading o parallela? So che in C puoi farlo per velocizzare l'elaborazione di grandi quantità di dati. – Michael