python - 结合sparse和einsum进行大稀疏求和
问题描述
我有一个形状=(N,N)的矩阵A和一个形状相同的矩阵B=(N,N)。我正在使用以下 einsum(使用opt_einsum库)构建矩阵 M:
M = oe.contract('nm,in,jm,pn,qm->ijpq', A, B, B, B, B)
这是评估以下总和:
这会产生形状为 (N, N, N, N) 的矩阵 M。然后我将其重塑为形状的二维数组 (N**2, N**2)
M = M.reshape((N**2, N**2))
这必须是二维的,因为它被视为线性算子。
我想使用稀疏库,因为 M 是稀疏的,并且变得太大而无法存储大 N。我可以使 A 和 B 稀疏,并将它们插入到oe.contract
.
问题是,sparse 仅支持 2D 数组,因此无法生成形状 (N, N, N. N) 的 4D 输出。有没有办法结合 einsum 和 reshape 步骤以允许以这种方式使用 sparse ,因为 M 的最终形状是 2D ?
解决方案
这可能对您的使用没有帮助opt_einsum
,但通过一些重组我可以加快np.einsum
相当多的速度,至少对于小型数组。
做两个的部分乘积B
:
c1 = np.einsum('in,jm->ijnm',B,B).reshape(N*N,N,N)
这pq
对是相同的,所以我们不需要重新计算它:
c2 = np.einsum('nm,onm,pnm->op',A,c1,c1)
我验证这适用于两个 (3,3) 数组,并且速度提高了大约 10 倍。
我们甚至可以将其重塑nm
为 1d,尽管这并不能提高速度:
c1 = np.einsum('in,jm->ijnm',B,B).reshape(N*N,N*N)
c3 = np.einsum('n,on,pn->op',A.reshape(N*N),c1,c1)
推荐阅读
- c# - 尝试加载 VimbaNET.dll 时出现 BadImageFormatException
- python - 在 PCA 图上画一条 Y 轴为 0.9 的垂直线
- r - 如何在 R 中为虚拟对象创建自动范围?
- image - 在 IIS 服务器上部署后使用 COM 引用
- java - 使用 Mockito Junit 测试异常类型
- label - In stata, how to bring down the first value on y axis to the base of the graoh?
- themes - 如何在 shopify 模板上制作选项卡式部分?
- angularjs - angularjs ui 引导选项卡未正确关闭
- azure-devops - AzureFileCopy 任务在 YAML 管道中失败 - 在发布管道中工作
- python - 为什么矩阵指数不能超过一定的大小?