【发布时间】:2021-03-05 04:58:38
【问题描述】:
我是 python 新手,需要您的帮助。
我有三个矩阵,特别是:
- 矩阵 M(矩阵类:scipy.sparse.csc.csc_matrix),维度:N x C;
- 矩阵G(矩阵类:numpy.ndarray),维度:C x T;
- 矩阵 L(矩阵类:numpy.ndarray),维度:T x N。
其中:N = 10000,C = 1000,T = 20。
我想计算一下,这个分数:
我尝试使用两个for 循环,一个用于i-index,一个用于c。此外,我使用dot 乘积来获得等式中的最后一个总和。但是我的实现需要太多时间才能给出结果。
这是我实现的:
score = 0.0
for i in range(N):
for c in range(C):
Mic = M[i,c]
score += np.outer(Mic,(np.dot(L[:,i],G[c,:])))
有没有办法避免两个for 循环?
提前谢谢你!
最好的
【问题讨论】:
-
我并不感到惊讶。在
numpy数组上这样的迭代很慢,在稀疏数组上的迭代更慢。csc矩阵针对矩阵乘法进行了优化(dot),甚至需要显着程度的稀疏性(相对于总形状只有几个非零值)。当Mic是标量值时,为什么要使用outer(可能是 0)? -
首先,
G.dot(L)甚至G@L应该给出一个 (C,N) 形状的数组。我打算建议M.dot(G@L),但那是 (N,N),而你想要它的对角线,或者更确切地说是它的轨迹。 -
我会试试这个解决方案!谢谢!
标签: python for-loop optimization product sparse-matrix