Tengo una matriz bidimensional, es decir, una matriz de secuencias que también son matrices. Para cada secuencia me gustaría calcular la autocorrelación, de modo que para una matriz (5,4), obtendría 5 resultados, o una matriz de dimensión (5,7).Autocorrelación de una matriz multidimensional en numpy
Sé que podría simplemente recorrer la primera dimensión, pero eso es lento y mi último recurso. ¿Hay otra manera?
Gracias!
EDIT:
Sobre la base de la respuesta elegida, más el comentario de MTRW, tengo la siguiente función:
def xcorr(x):
"""FFT based autocorrelation function, which is faster than numpy.correlate"""
# x is supposed to be an array of sequences, of shape (totalelements, length)
fftx = fft(x, n=(length*2-1), axis=1)
ret = ifft(fftx * np.conjugate(fftx), axis=1)
ret = fftshift(ret, axes=1)
return ret
Tenga en cuenta que la longitud es una variable global en mi código, así que asegúrese de declarar eso. Tampoco restringí el resultado a los números reales, ya que también debo tener en cuenta los números complejos.
+1 para el enfoque basado en FFT. En cuanto a la respuesta con forma de (5,7), ha calculado la correlación circular (http://en.wikipedia.org/wiki/Discrete_Fourier_transform#Circular_convolution_theorem_and_cross-correlation_theorem). Simplemente rellene cada fila con 3 ceros para que la multiplicación espectral no se ajuste, y obtendrá lo que pidió la pregunta original. – mtrw
Gracias muchachos, ¡eso parece prometedor! Para relleno cero, solo necesito agregar n = (longitud * 2-1) a fft ?? – Christoph
Para una secuencia 1-D con n variables, esta solución se rellenaría con n-1 ceros. Entonces, si la forma de los datos hubiera sido (5, 121), la forma del relleno sería (5, 120) – Andrew