【发布时间】:2021-05-17 00:48:38
【问题描述】:
我有一个形状=(N,N)的矩阵A和一个形状相同=(N,N)的矩阵B。 我正在使用以下 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))
这必须是二维的,因为它被视为线性运算符。
我想使用 sparse 库,因为 M 是稀疏的,并且变得太大而无法存储大 N。我可以使 A 和 B 稀疏,并将它们插入到 oe.contract。
问题是,sparse 仅支持 2D 数组,因此无法生成形状 (N, N, N. N) 的 4D 输出。有没有办法结合 einsum 和 reshape 步骤以允许以这种方式使用 sparse,因为 M 的最终形状是 2D?
【问题讨论】:
-
opt_einsum是我们很少有人使用过的第三方库(甚至有tag吗?)。快速浏览一下文档并不能说明它是否可以与sparse矩阵一起使用。np.einsum当然不能。 -
@hpaulj
opt_einsum确实支持sparse矩阵,如文档 (optimized-einsum.readthedocs.io/en/stable/backends.html) 中所示:“稀疏库也符合要求并受支持....”跨度> -
@hpaulj FWIW
opt_einsum每月获得大约 600 万次下载,许多人在不知情的情况下使用它(tensorflow 就是一个很好的例子),并且旧算法在np.einsum中实现。它并不总是像您在 SO 示例中所希望的那样工作,因为它们通常很小,这意味着 BLAS 的成本高于直接 einsum 和/或天真的 einsum 的扩展问题不会起到很大的作用。 (免责声明:opt_einsum 的作者)
标签: python arrays sparse-matrix numpy-einsum