numpy中多维数组的自相关

Chr*_*oph 12 python numpy

我有一个二维数组,即一个也是数组的序列数组.对于每个序列,我想计算自相关,因此对于(5,4)数组,我将获得5个结果,或维数(5,7).

我知道我可以绕过第一个维度,但这很慢,我的最后一招.还有另外一种方法吗?

谢谢!

编辑:

根据所选答案加上mtrw的评论,我有以下功能:

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
Run Code Online (Sandbox Code Playgroud)

请注意,length是我的代码中的全局变量,因此请务必声明它.我也没有将结果限制为实数,因为我也需要考虑复数.

And*_*rew 9

使用基于FFT的自相关:

import numpy
from numpy.fft import fft, ifft

data = numpy.arange(5*4).reshape(5, 4)
print data
##[[ 0  1  2  3]
## [ 4  5  6  7]
## [ 8  9 10 11]
## [12 13 14 15]
## [16 17 18 19]]
dataFT = fft(data, axis=1)
dataAC = ifft(dataFT * numpy.conjugate(dataFT), axis=1).real
print dataAC
##[[   14.     8.     6.     8.]
## [  126.   120.   118.   120.]
## [  366.   360.   358.   360.]
## [  734.   728.   726.   728.]
## [ 1230.  1224.  1222.  1224.]]
Run Code Online (Sandbox Code Playgroud)

我对你对维度(5,7)的答案的陈述感到有点困惑,所以也许有些重要我不理解.

编辑:在mtrw的建议,一个不包裹的填充版本:

import numpy
from numpy.fft import fft, ifft

data = numpy.arange(5*4).reshape(5, 4)
padding = numpy.zeros((5, 3))
dataPadded = numpy.concatenate((data, padding), axis=1)
print dataPadded
##[[  0.   1.   2.   3.   0.   0.   0.   0.]
## [  4.   5.   6.   7.   0.   0.   0.   0.]
## [  8.   9.  10.  11.   0.   0.   0.   0.]
## [ 12.  13.  14.  15.   0.   0.   0.   0.]
## [ 16.  17.  18.  19.   0.   0.   0.   0.]]
dataFT = fft(dataPadded, axis=1)
dataAC = ifft(dataFT * numpy.conjugate(dataFT), axis=1).real
print numpy.round(dataAC, 10)[:, :4]
##[[   14.     8.     3.     0.     0.     3.     8.]
## [  126.    92.    59.    28.    28.    59.    92.]
## [  366.   272.   179.    88.    88.   179.   272.]
## [  734.   548.   363.   180.   180.   363.   548.]
## [ 1230.   920.   611.   304.   304.   611.   920.]]
Run Code Online (Sandbox Code Playgroud)

必须有一种更有效的方法来做到这一点,特别是因为自相关是对称的,我没有利用它.

  • 基于FFT的方法为+1.至于(5,7)形状的答案,你已经计算了循环相关性(http://en.wikipedia.org/wiki/Discrete_Fourier_transform#Circular_convolution_theorem_and_cross-correlation_theorem).只需用3个零填充每一行,这样光谱倍增就不会被包围,你就可以得到原始问题所要求的内容. (4认同)