циклический кросс-корреляционный питон

Возможно ли выполнять циклическую кросс-/ автокорреляцию на 1D-массивах с помощью функции numpy / scipy / matplotlib? Я просмотрел numpy.correlate () и matplotlib.pyplot.xcorr (на основе функции numpy), и оба, похоже, не могут выполнять круговую взаимную корреляцию.

Чтобы проиллюстрировать разницу, я буду использовать пример массива из [1, 2, 3, 4]. При круговой корреляции делается периодическое предположение, а отставание 1 выглядит как [2, 3, 4, 1]. Найденные функции python, похоже, используют нулевое дополнение, т. Е. [2, 3, 4, 0]. Есть ли способ заставить эти функции выполнять круговую корреляцию? Если нет, существует ли стандартное обходное решение для круговых корреляций?

Вы можете реализовать периодическую (ака круглая) кросс-корреляцию с помощью FFT :

from numpy.fft import fft, ifft def periodic_corr(x, y): """Periodic correlation, implemented using the FFT. x and y must be real sequences with the same length. """ return ifft(fft(x) * fft(y).conj()).real 

Вы также можете реализовать его с помощью np.correlate , если вы не против накладных расходов, вызванных np.hstack((y[1:], y)) :

 import numpy as np def periodic_corr_np(x, y): """Periodic correlation, implemented using np.correlate. x and y must be real sequences with the same length. """ return np.correlate(x, np.hstack((y[1:], y)), mode='valid') 
 from numpy import roll, correlate x = [1,2,3,4] roll(x, 1) #[4,1,2,3] roll(x, 2) #[3,4,1,2] roll(x, 3) #[2,3,4,1] 

Чтобы соотнести x с x, круговым сдвинутым на k, вы могли бы сделать

 k = 2 correlate(x, roll(x,k))