Самое простое, что я смог найти, это использовать пакет scipy.stats
In [8]: x
Out[8]:
array([[ 0. , 0. , 0. ],
[-1. , 0. , -1. ],
[-2. , 0. , -2. ],
[-3. , 0. , -3. ],
[-4. , 0.1, -4. ]])
In [9]: y
Out[9]:
array([[0. , 0. ],
[1. , 0. ],
[2. , 0. ],
[3. , 0. ],
[4. , 0.1]])
In [10]: import scipy.stats
In [27]: (scipy.stats.cov(y,x)
/(numpy.sqrt(scipy.stats.var(y,axis=0)[:,numpy.newaxis]))
/(numpy.sqrt(scipy.stats.var(x,axis=0))))
Out[27]:
array([[-1. , 0.70710678, -1. ],
[-0.70710678, 1. , -0.70710678]])
Это не числа, которые вы получили, но вы перепутали свои строки. (Элемент [0,0] должен быть 1.)
Более сложное, но чисто крошечное решение:
In [40]: numpy.corrcoef(x.T,y.T)[numpy.arange(x.shape[1])[numpy.newaxis,:]
,numpy.arange(y.shape[1])[:,numpy.newaxis]]
Out[40]:
array([[-1. , 0.70710678, -1. ],
[-0.70710678, 1. , -0.70710678]])
Это будет медленнее, потому что вычисляет корреляцию каждого элемента в x с каждым другим элементом в x, что вам не нужно. Кроме того, передовые методы индексации, используемые для получения нужного подмножества массива, могут привести к болям в голове.
Если вы собираетесь интенсивно использовать numpy, ознакомьтесь с правилами трансляции и индексации . Они помогут вам подтолкнуть как можно больше до уровня C.