首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分数计算耗时太长:避免循环- python

分数计算耗时太长:避免循环- python
EN

Stack Overflow用户
提问于 2021-03-03 22:12:59
回答 1查看 78关注 0票数 1

我是刚接触python的人,我需要您的帮助。

我有三个矩阵,特别是:

  • 矩阵M(矩阵类: scipy.sparse.csc.csc_matrix),维数:N;
  • 矩阵G(矩阵类: numpy.ndarray),维数:C;
  • 矩阵L(矩阵类: numpy.ndarray),维数:T.

其中:n= 10000,C= 1000,T= 20。

我想计算一下,这个分数:

我尝试使用两个for循环,一个用于i-index,另一个用于c。此外,我使用一个dot乘积来得到方程中的最后一次和。但是我的实现需要太多的时间才能给出结果。

这就是我所实施的:

代码语言:javascript
复制
    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循环吗?

提前谢谢你!

最好的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-03 23:03:12

试试这个score = np.einsum("ic,ti,ct->", M, L, G)

EDIT1

顺便说一下,在您的例子中,score = np.sum(np.diag(M @ G @ L)) (在PYTHON3中,从版本3.5开始,您可以使用@操作符用于matmul函数的语义)比einsum更快(特别是在np.trace((L @ M) @ G )中,由于内存的高效使用,@hpaulj在他的注释中可能表示了这一点)。但是,对于复杂的张量产品,einsum更容易使用(使用einsum编码,我直接使用了数学表达式,而不考虑优化)。

通常,将fornumpy结合使用会导致计算速度急剧减慢(在numpy的情况下,请考虑“矢量化计算”)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66465715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档