我有一个二维数组,即一个也是数组的序列数组.对于每个序列,我想计算自相关,因此对于(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是我的代码中的全局变量,因此请务必声明它.我也没有将结果限制为实数,因为我也需要考虑复数.
使用基于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)
必须有一种更有效的方法来做到这一点,特别是因为自相关是对称的,我没有利用它.