【问题标题】:Multiplication of sparse 3D matrix with 2D matrix稀疏 3D 矩阵与 2D 矩阵的乘法
【发布时间】:2020-10-24 15:54:54
【问题描述】:

我有稀疏的 COO 3D A 矩阵 NxNxM(第三维是 M)和密集的 2D B 矩阵 (NxN),这将是我的求解器的优化变量。我想将 A 和 B 相乘以获得 (NxNXM) 矩阵。然后我需要对生成的 3D 矩阵的元素求和以创建 2D 矩阵 (NxN)。

为了澄清,如果我不使用稀疏矩阵,我可以用下面的代码来做。它是 3D 和 2D 矩阵的乘法。

np.sum(np.einsum('ijk,jk->ijk', A, B))

其中 A 是 3D 矩阵,B 是 2D 矩阵。

我的目标函数是最小化稀疏 A 与决策变量矩阵 B 相乘的元素之和。

我该怎么做?

我正在使用pydata sparse library 创建稀疏矩阵。

【问题讨论】:

  • pydata 提供什么?使用scipy.sparse 包,您必须使用它自己的乘法方法。 numpy 函数做错了。
  • 您只能将 2D 矩阵与 scipy.sparse 相乘,但我的 A 矩阵是 3D 且它是稀疏的。
  • 您想要逐元素乘积还是点积?
  • @CJR 逐元素乘法

标签: python matrix sparse-matrix matrix-multiplication


【解决方案1】:

https://sparse.pydata.org/en/stable/

幸运的是,在许多情况下,我们可以利用现有的 scipy.sparse 算法,如果我们可以智能地将我们的多维数组转置和重新整形为适当的二维稀疏矩阵,执行修改后的稀疏矩阵运算,然后重新整形和转置回来.这些重塑和转置操作都可以通过修改坐标数组以 numpy 的速度完成。在 scipy.sparse 运行它的操作(通常用 C 编写)之后,我们可以转换回使用相同的重塑和转置路径。

它所做的就是这个;你应该剪掉中间人。通过将其作为 3d 数组执行,您确实没有任何收获,只是更难使用。

from scipy import sparse
import numpy as np    

M, N = 1000, 100

A = sparse.random(M, N ** 2, density=0.01, format='csr')
B = np.random.rand(N ** 2)

C = A.multiply(B).sum(axis=0).A

>>> A
<1000x10000 sparse matrix of type '<class 'numpy.float64'>'
    with 100000 stored elements in Compressed Sparse Row format>
>>> B.shape
(10000,)
>>> C.shape
(1, 10000)

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2016-12-11
    相关资源
    最近更新 更多