在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)发布于 2011-08-09 13:08:04
要交叉关联一维阵列,请使用numpy.correlate。
对于2d数组,请使用scipy.signal.correlate2d。
还有scipy.stsci.convolve.correlate2d。
还有基于numpy.correlate的matplotlib.pyplot.xcorr。
有关不同实现的一些链接,请参阅this post on the SciPy mailing list。
编辑:@user333700在评论中添加了指向SciPy ticket for this issue的链接。
发布于 2018-08-18 23:17:37
对于一维阵列,numpy.correlate比scipy.signal.correlate更快,在不同的大小下,我看到使用numpy.correlate的性能提高了5倍。当两个数组大小相似时(连接对角线的亮线),性能差异更加显著(50x +)。
# a simple benchmark
res = []
for x in range(1, 1000):
list_x = []
for y in range(1, 1000):
# generate different sizes of series to compare
l1 = np.random.choice(range(1, 100), size=x)
l2 = np.random.choice(range(1, 100), size=y)
time_start = datetime.now()
np.correlate(a=l1, v=l2)
t_np = datetime.now() - time_start
time_start = datetime.now()
scipy.signal.correlate(in1=l1, in2=l2)
t_scipy = datetime.now() - time_start
list_x.append(t_scipy / t_np)
res.append(list_x)
plt.imshow(np.matrix(res))

默认情况下,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]https://stackoverflow.com/questions/6991471
复制相似问题