不同形状阵列的快速numpy协方差

时间:2017-11-10 13:29:13

标签: python arrays performance numpy covariance

我需要获得形状a的数组(M1, M2, N)与形状b的另一个数组(N,)之间的协方差。

我目前所做的是使用for块:

import numpy as np

M1, M2, N = 23, 50, 117
a = np.random.uniform(-2., 2., (M1, M2, N))
b = np.random.uniform(-1., 1., N)

c = []
for i in range(M1):
    for j in range(M2):
        c.append(np.cov(a[i][j], b)[0, 1])

但是大(M1, M2)的速度有点慢。有没有办法加快速度呢?

1 个答案:

答案 0 :(得分:2)

您可以随时手动计算cov。以下是分别使用doteinsum的两条建议。

import numpy as np

M1, M2, N = 23, 50, 117
a = np.random.uniform(-2., 2., (M1, M2, N))
b = np.random.uniform(-1., 1., N)

c = []
for i in range(M1):
    for j in range(M2):
        c.append(np.cov(a[i][j], b)[0, 1])

c1 = np.reshape(c, (M1, M2))

ac = a - a.mean(axis=-1, keepdims=True)
bc = (b - b.mean()) / (N-1)

c2 = np.dot(ac, bc)
c3 = np.einsum('ijk,k->ij', ac, bc)
print(np.allclose(c1, c2))
print(np.allclose(c1, c3))

打印

True
True