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]