在Python中计算XMX^T对角线的快速方法

2023-12-12

我需要在没有 for 循环的情况下计算 XMX^T 的对角线,或者换句话说,替换以下 for 循环:

X = nump.random.randn(10000, 100)
M = numpy.random.rand(100, 100)
out = numpy.zeros(10000)
for n in range(10000):
  out[n] = np.dot(np.dot(X[n, :], M), X[n, :])

我知道我应该使用numpy.einsum,但我一直无法弄清楚如何?

非常感谢!


当然有一个np.einsum方式,就像这样——

np.einsum('ij,ij->i',X.dot(M),X)

这滥用了第一级的快速矩阵乘法X.dot(M)然后使用np.einsum保留第一个轴,求和减少第二个轴。

运行时测试 -

本节比较了迄今为止发布的解决该问题的所有方法。

In [132]: # Setup input arrays
     ...: X = np.random.randn(10000, 100)
     ...: M = np.random.rand(100, 100)
     ...: 
     ...: def original_app(X,M):
     ...:     out = np.zeros(10000)
     ...:     for n in range(10000):
     ...:       out[n] = np.dot(np.dot(X[n, :], M), X[n, :])
     ...:     return out
     ...: 

In [133]: np.allclose(original_app(X,M),np.einsum('ij,ij->i',X.dot(M),X))
Out[133]: True

In [134]: %timeit original_app(X,M) # Original solution
10 loops, best of 3: 97.8 ms per loop

In [135]: %timeit np.dot(X, np.dot(M,X.T)).trace()# @Colonel Beauvel's solution
1 loops, best of 3: 2.24 s per loop

In [136]: %timeit np.einsum('ij,jk,ik->i', X, M, X) # @hpaulj's solution
1 loops, best of 3: 442 ms per loop

In [137]: %timeit np.einsum('ij,ij->i',X.dot(M),X) # Proposed in this post
10 loops, best of 3: 28.1 ms per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中计算XMX^T对角线的快速方法 的相关文章

随机推荐