In [6]:
from __future__ import division, print_function
import numpy as np
import matplotlib.pyplot as pp
%matplotlib inline

In [7]:
def xcorr(a, b, mode='same'):
    """
    Computes the cross correlation between 2 lists
    """
    
    a = np.asarray(a)
    b = np.asarray(b)
    
    # Compute Z-scores
    a = (a - a.mean()) / np.sqrt(np.correlate(a, a))
    b = (b - b.mean()) / np.sqrt(np.correlate(b, b))
    
    r = np.correlate(a, b, mode) # cross correlation
    
    # Calculate lags
    lag_max = int(len(r) / 2)
    lags = np.asarray(xrange(-lag_max, lag_max + len(r) % 2))
    
    sl = 2 / np.sqrt(len(r))
    
    return r, lags, sl

In [9]:
def xcorr_sf(a, b, lag_max=None):
    """
    """
    
    a = np.asarray(a)
    b = np.asarray(b)
    
    assert len(a) == len(b)
    n = len(a)
    
    if lag_max == None:
        lag_max = n - 1
    
    assert lag_max >= 0 and lag_max < n
    
    lags = xrange(-lag_max, lag_max + 1)
    
    sl = np.zeros(len(lags)) # Significance level
    
    r = np.zeros(len(lags))
    
    for i in xrange(len(lags)):
        lag = lags[i]
        sl[i] = 2 / (np.sqrt(n - abs(lag)))
        a2 = a[:n - lag] if lag >= 0 else a[-lag:]
        a2 -= a2.mean()
        b2 = b[lag:]     if lag >= 0 else b[:lag]
        b2 -= b2.mean()
        r[i] = np.correlate(a2, b2) / np.sqrt(np.correlate(a2, a2) * np.correlate(b2, b2))
    
    return r, lags, sl

In [13]:
n=100
x=np.array(range(n))
a=np.random.normal(size=n)
b=np.random.normal(size=n)

r, lags, sl = xcorr(a, a)
pp.plot(lags, r)
pp.plot(lags, np.ones(len(lags)) * sl, color='r')
pp.plot(lags, np.ones(len(lags)) * -sl, color='r')
pp.show()

r, lags, sl = xcorr_sf(a, a, lag_max=int(len(a)/2))
pp.plot(lags, r)
pp.plot(lags, sl, color='r')
pp.plot(lags, -sl, color='r')
pp.show()



In [ ]: