入侵
numpy.cov sourcepre并尝试使用默认参数。事实证明,
np.cov(x[i,:,:])将很简单:
N = x.shape[2]m = x[i,:,:]m -= np.sum(m, axis=1, keepdims=True) / Ncov = np.dot(m, m.T) /(N - 1)
因此,任务是对这个循环进行矢量化处理,该循环将一次性遍历
i并处理所有数据
x。同样,我们可以
broadcasting在第三步中使用。对于最后一步,我们将
sum-reduction沿第一轴上的所有切片在此处执行。可以通过向量化方式有效地实现
np.einsum。因此,最终的实现是这样的-
N = x.shape[2]m1 = x - x.sum(2,keepdims=1)/Ny_out = np.einsum('ijk,ilk->ijl',m1,m1) /(N - 1)运行时测试
In [155]: def original_app(x): ...: n = x.shape[0] ...: y = np.zeros((n,2,2)) ...: for i in np.arange(x.shape[0]): ...: y[i]=np.cov(x[i,:,:]) ...: return y ...: ...: def proposed_app(x): ...: N = x.shape[2] ...: m1 = x - x.sum(2,keepdims=1)/N ...: out = np.einsum('ijk,ilk->ijl',m1,m1) / (N - 1) ...: return out ...:In [156]: # Setup inputs ...: n = 10000 ...: x = np.random.rand(n,2,4) ...:In [157]: np.allclose(original_app(x),proposed_app(x))Out[157]: True # Results verifiedIn [158]: %timeit original_app(x)1 loops, best of 3: 610 ms per loopIn [159]: %timeit proposed_app(x)100 loops, best of 3: 6.32 ms per loop巨大的加速!



