numpy.correlate#

numpy.correlate(a, v, mode='valid')[источник]#

Взаимная корреляция двух одномерных последовательностей.

Эта функция вычисляет корреляцию, как она обычно определена в текстах по обработке сигналов [1]:

\[c_k = \sum_n a_{n+k} \cdot \overline{v}_n\]

с последовательностями a и v, дополненными нулями при необходимости, и \(\overline v\) обозначает комплексное сопряжение.

Параметры:
a, varray_like

Входные последовательности.

mode{‘valid’, ‘same’, ‘full’}, необязательно

См. convolve docstring. Обратите внимание, что значение по умолчанию — 'valid', в отличие от convolve, который использует 'full'.

Возвращает:
выходndarray

Дискретная взаимная корреляция a и v.

Смотрите также

convolve

Дискретная, линейная свертка двух одномерных последовательностей.

scipy.signal.correlate

использует FFT, который имеет превосходную производительность на больших массивах.

Примечания

Определение корреляции выше не является уникальным, и иногда корреляция может определяться иначе. Другое распространённое определение — [1]:

\[c'_k = \sum_n a_{n} \cdot \overline{v_{n+k}}\]

что связано с \(c_k\) by \(c'_k = c_{-k}\).

numpy.correlate может работать медленно в больших массивах (т.е. n = 1e5), потому что не использует БПФ для вычисления свертки; в этом случае scipy.signal.correlate может быть предпочтительнее.

Ссылки

[1] (1,2)

Википедия, «Взаимная корреляция», https://en.wikipedia.org/wiki/Cross-correlation

Примеры

>>> import numpy as np
>>> np.correlate([1, 2, 3], [0, 1, 0.5])
array([3.5])
>>> np.correlate([1, 2, 3], [0, 1, 0.5], "same")
array([2. ,  3.5,  3. ])
>>> np.correlate([1, 2, 3], [0, 1, 0.5], "full")
array([0.5,  2. ,  3.5,  3. ,  0. ])

Использование комплексных последовательностей:

>>> np.correlate([1+1j, 2, 3-1j], [0, 1, 0.5j], 'full')
array([ 0.5-0.5j,  1.0+0.j ,  1.5-1.5j,  3.0-1.j ,  0.0+0.j ])

Обратите внимание, что вы получаете результат с обращенным временем и комплексным сопряжением (\(\overline{c_{-k}}\)) когда две входные последовательности a и v меняются местами:

>>> np.correlate([0, 1, 0.5j], [1+1j, 2, 3-1j], 'full')
array([ 0.0+0.j ,  3.0+1.j ,  1.5+1.5j,  1.0+0.j ,  0.5+0.5j])