2014-09-14 2 views
3

У меня есть пара 1D массивов (разной длины), как следующее:кросскорреляция Python

data1 = [0,0,0,1,1,1,0,1,0,0,1] 
data2 = [0,1,1,0,1,0,0,1] 

Я хотел бы получить максимальную взаимную корреляцию серии 2 в питона. В MATLAB, функция xcorr() будет возвращать его OK

Я попытался следующие 2 метода:

  1. numpy.correlate(data1, data2)
  2. signal.fftconvolve(data2, data1[::-1], mode='full')

Оба метода дают мне одни и те же ценности, но ценности Я получаю от python отличные от того, что выходит из Matlab. Python дает мне целые значения> 1, тогда как matlab дает фактические значения корреляции от 0 до 1.

Я попытался нормализовать сначала 2 массива (среднее значение/SD), но значения взаимной корреляции, которые я получаю, находятся в тысячах который не кажется правильным.

Matlab также даст вам значение запаздывания, при котором кросс-корреляция является наибольшей. Я предполагаю, что это легко сделать с помощью индексов, но что является наиболее подходящим способом для этого, если мои массивы содержат 10 тысяч значений?

Я хотел бы подражать функции xcorr(), что у matlab есть любые мысли о том, как я буду делать это в python?

+0

Пожалуйста, пост фактические и ожидаемые значения от MATLAB и 2 питона LIBS –

+0

Приведи это http://stackoverflow.com/questions/6991471/вычислительная кросс-корреляционная функция –

+0

Я видел эту ветку некоторое время назад и пробовал все эти методы. numpy.correlate дает мне значения от 1 до 500. и xcorr() требует, чтобы 2 1D-массивы имели одинаковую длину (мины не равны) – Simon

ответ

5
numpy.correlate(arr1,arr2,"full") 

дал мне тот же результат, как

xcorr(arr1,arr2) 

дает в MATLAB

+0

Как вы получаете время от этого? – bischoffingston

+1

добавление «full» to numpy.correlate() делает трюк. Чтобы получить максимальное временное отставание, я просто вызываю argmax() при возврате из коррелята() – Simon

+0

. Чтобы уточнить, отставание 0 соответствует центру выходного массива. Поэтому, если c = xcorr (arr1, arr2), то lag = argmax (c) -c.size/2 – argentum2f