Python 计算互相关函数?

Python 计算互相关函数?,python,r,statistics,numpy,scipy,Python,R,Statistics,Numpy,Scipy,在R中,我使用ccf或acf计算成对互相关函数,以便找出哪个移位给了我最大值。从外观上看,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) 要交叉关联1d阵列,请使用 对于二维阵

R
中,我使用
ccf
acf
计算成对互相关函数,以便找出哪个移位给了我最大值。从外观上看,
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)

要交叉关联1d阵列,请使用

对于二维阵列,请使用

还有

还有一个是基于numpy.correlate的

有关不同实现的一些链接,请参阅


编辑:@user333700在注释中添加了指向的链接。

如果您正在寻找一个或两个维度中的快速、规范化互相关 我建议使用openCV库(请参阅)。该组维护的互相关代码是您将发现的最快的代码,并且它将被规范化(结果介于-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)

对于一维互相关,创建一个形状等于(N,1)的二维阵列。尽管转换为openCV格式需要一些额外的代码,但通过scipy的速度非常惊人。

我刚刚完成了自己的N维阵列归一化互相关优化实现。你可以从我这里得到它


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

对于1D阵列,
numpy.correlate
在不同大小下比
scipy.signal.correlate
快,我使用
numpy.correlate
看到一致的5倍性能增益。当两个阵列具有相似的大小(连接对角线的亮线)时,性能差异更为显著(50x+)

默认情况下,scipy.signal.correlate通过填充计算一些额外的数字,这可能解释了性能差异

>> l1 = [1,2,3,2,1,2,3]
>> l2 = [1,2,3]
>> print(numpy.correlate(a=l1, v=l2))
>> print(scipy.signal.correlate(in1=l1, in2=l2))

[14 14 10 10 14]
[ 3  8 14 14 10 10 14  8  3]  # the first 3 is [0,0,1]dot[1,2,3]

从邮件列表帖子链接的实现肯定使用FFT,也许它们会有所帮助。此外,我不知道poster的速度有多快。np.correlate不使用fft,仅当第二个系列/窗口相对于第一个系列/窗口较小时,速度才会更快。还有scipy.signal.fftconvolve。另请参阅所有邮件列表链接都已断开-(@AndreAraujo I更新了指向SciPy票证的链接,以指向internet存档,因为原始页面似乎已消失。所有其他链接(包括邮件列表链接)都适用于我。仅供参考,如果您不想使用OpenCV,也可以使用scikit图像执行此操作。请参阅。
>> l1 = [1,2,3,2,1,2,3]
>> l2 = [1,2,3]
>> print(numpy.correlate(a=l1, v=l2))
>> print(scipy.signal.correlate(in1=l1, in2=l2))

[14 14 10 10 14]
[ 3  8 14 14 10 10 14  8  3]  # the first 3 is [0,0,1]dot[1,2,3]