计算互相关函数?

Leg*_*end 30 python statistics numpy r scipy

R,我正在使用ccfacf计算成对的互相关函数,以便我可以找出哪个班次给了我最大值.从它的外观,R给我一个标准化的值序列.在Python的scipy中是否有类似的东西,或者我应该使用该fft模块来做它?目前,我的工作如下:

xcorr = lambda x,y : irfft(rfft(x)*rfft(y[::-1]))
x = numpy.array([0,0,1,1])
y = numpy.array([1,1,0,0])
print xcorr(x,y)
Run Code Online (Sandbox Code Playgroud)

agf*_*agf 44

要使1d数组进行交叉关联,请使用numpy.correlate.

对于2d数组,请使用scipy.signal.correlate2d.

还有scipy.stsci.convolve.correlate2d.

还有matplotlib.pyplot.xcorr,它基于numpy.correlate.

有关不同实现的链接,请参阅SciPy邮件列表中的这篇文章.

编辑:@ user333700 在评论中为此问题添加了SciPy票证的链接.

  • np.correlate不使用fft,并且仅在第二个系列/窗口相对于第一个系列/窗口较小时才更快.还有scipy.signal.fftconvolve.另见http://projects.scipy.org/numpy/ticket/1260 (7认同)

ncR*_*ert 14

如果您正在寻找一维或二维的快速,标准化的互相关,我会推荐openCV库(参见 http://opencv.willowgarage.com/wiki/ http://opencv.org/).由该组维护的互相关代码是您将找到的最快,它将被标准化(结果在-1和1之间).

虽然这是一个C++库,但代码是使用CMake维护的,并且具有python绑定,因此可以方便地访问互相关函数.OpenCV也很适合numpy.如果我想从numpy数组开始计算二维互相关,我可以按如下方式进行.

import numpy
import cv

#Create a random template and place it in a larger image
templateNp = numpy.random.random( (100,100) )
image = numpy.random.random( (400,400) )
image[:100, :100] = templateNp

#create a numpy array for storing result
resultNp = numpy.zeros( (301, 301) )

#convert from numpy format to openCV format
templateCv = cv.fromarray(numpy.float32(template))
imageCv = cv.fromarray(numpy.float32(image))
resultCv =  cv.fromarray(numpy.float32(resultNp))

#perform cross correlation
cv.MatchTemplate(templateCv, imageCv, resultCv, cv.CV_TM_CCORR_NORMED)

#convert result back to numpy array
resultNp = np.asarray(resultCv)
Run Code Online (Sandbox Code Playgroud)

对于仅1-D互相关,创建形状等于(N,1)的2-D阵列.虽然转换为openCV格式需要一些额外的代码,但scipy的加速速度令人印象深刻.

  • 仅供参考,如果您不想使用OpenCV,也可以使用scikit-image执行此操作.参见[本例](http://scikit-image.org/docs/0.9.x/auto_examples/plot_template.html). (2认同)

ali*_*i_m 11

我刚刚为N维数组编写了自己的规范化互相关优化实现.你可以从这里得到它.

它将直接,使用scipy.ndimage.correlate或在频域中计算互相关,使用scipy.fftpack.fftn/ ifftn取决于哪个最快.