Pregunta

¿Hay una correlación cruzada o la convolución función basada en la FFT 2D integrado en scipy (u otra biblioteca popular)?

Hay funciones como las siguientes:

  • scipy.signal.correlate2d - "el método directo ejecutado por convolveND será reducir la velocidad de datos de gran tamaño "
  • scipy.ndimage.correlate - "La matriz está correlacionada con el núcleo dado usando cálculo exacto (es decir, no FFT) ".
  • scipy.fftpack.convolve.convolve, lo que no entiendo muy bien, pero parece mal

numarray tenía una función rel="noreferrer"> correlate2d() fft=True , pero supongo que fue doblado numarray en numpy, y no puedo encontrar si se incluye esta función.

¿Fue útil?

Solución

He encontrado scipy.signal.fftconvolve, como también señaló por Magnus , pero no me di cuenta en el momento que se trata de n -dimensional. Ya que es una función de y produce los valores de la derecha, parece que la solución ideal.

Desde Ejemplo de 2D Convolución :

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.]])

correcta! La versión STSCI, por el contrario, requiere un trabajo extra para hacer que los límites correctos?

In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]: 
array([[-12., -12., -12.],
       [-24., -24., -24.],
       [-12., -12., -12.]])

(El método STSCI también requiere la compilación, que estaba sin éxito con (acabo comentada las partes no Python), tiene algunos errores como esta y modificar las entradas ([1, 2] se convierte en [[1, 2]]), etc. Así que cambió mi aceptado respuesta a la función integrada de fftconvolve() .)

Correlación, por supuesto, es el mismo que convolución, pero con una entrada invierte:

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]])

la última revisión ha sido acelerado por el uso de tamaños de potencia de dos internos (y entonces aceleré hasta más de usando FFT real para la entrada real de y usando longitudes de 5-lisas en vez de potencias de 2 :. D)

Otros consejos

vistazo a scipy.signal.fftconvolve, signal.convolve y signal.correlate (hay un signal.correlate2d pero parece devolver una matriz cambiado, no centrado).

Creo que desea que el paquete scipy.stsci:

http://docs.scipy.org/doc/scipy/reference /stsci.html

In [30]: scipy.__version__
Out[30]: '0.7.0'

In [31]: from scipy.stsci.convolve import convolve2d, correlate2d

He perdido la cuenta de la situación de este paquete en scipy, pero sé incluimos ndimage como parte del paquete de la versión stsci_python como una conveniencia para nuestros usuarios:

http://www.stsci.edu/resources/software_hardware / pyraf / stsci_python / corriente / descarga

o usted debería ser capaz de tirar desde el repositorio si lo prefiere:

https://www.stsci.edu/svn/ SSB / stsci_python / stsci_python / trunk / ndimage /

I escribió una envoltura / convolución de correlación cruzada que se encarga de relleno y nans e incluye un simple envoltura lisa aquí . No es un paquete popular, pero también no tiene dependencias, además de numpy (o fftw de FFT más rápidos).

También he implementado un código de prueba de velocidad FFT aquí por si alguien está interesado. Muestra - sorprendentemente -. FFT de que es más rápido que numpy de SciPy, al menos en mi máquina

EDIT: código trasladado a N-dimensional versión aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top