【问题标题】:Determining a sparse matrix quotient确定稀疏矩阵商
【发布时间】:2017-02-24 08:17:18
【问题描述】:

我希望在 python 2.7 中划分两个稀疏矩阵,本质上是k = numerator / denominator,结果是sp.csr_matrix 类型的稀疏矩阵。我正在使用scipy as spnumpy as np

为此,我遵循采用分子的点积和分母的倒数的线性格式。这两个项目的格式都是sp.csr_matrix(([],([],[])),shape=[R,R])

k本身的计算是

k = sp.csr_matrix(numerator.dot(sp.linalg.inv(denominator)))

这样做会返回警告:

SparseEfficiencyWarning: splu requires CSC matrix format
warn('splu requires CSC matrix format', SparseEfficiencyWarning)

上述警告意味着什么关于将k 的身份确定为两个稀疏矩阵之间的商?

有没有更有效的方法在python中生成稀疏矩阵和稀疏矩阵逆的点积(两个稀疏矩阵的商)?

我之前找到了Inverting large sparse matrices with scipy,但是我想知道这是否已经过时了。

【问题讨论】:

  • 为什么 2013 年的答案会过时?有没有发现sparseinv 功能或讨论?
  • 我认为由于 scipy 库中的更新,它可能已经过时,并且创建了一个我找不到的成员函数。没有找到关于稀疏逆的讨论。
  • 一条评论表明 sparse.linalg.inv 正在开发中 - 这在我的版本中存在。
  • 是的,我目前在点积中使用 sp.linalg.inv,但是我收到了问题中详细说明的警告,我主要想知道警告是否可能是 3 小时过去的原因,并且终端没有返回结果...

标签: python performance numpy scipy sparse-matrix


【解决方案1】:

借用 2013 年的答案:

In [409]: a=np.random.rand(3,3)
In [410]: A=sparse.csr_matrix(a)
In [411]: np.linalg.inv(a)
Out[411]: 
array([[ 26.11275413,  -4.17749006,  -9.82626551],
       [-37.22611759,   9.38404027,  13.80073216],
       [  7.59314843,  -2.04314605,  -1.58410661]])

np inv 不是sparse-aware

In [412]: np.linalg.inv(A) 
 ....
LinAlgError: 0-dimensional array given. Array must be at least two-dimensional

from scipy.sparse import linalg:

In [414]: linalg.inv(A).A
/usr/lib/python3/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py:243: SparseEfficiencyWarning: splu requires CSC matrix format
  warn('splu requires CSC matrix format', SparseEfficiencyWarning)
/usr/lib/python3/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py:161: SparseEfficiencyWarning: spsolve is more efficient when sparse b is in the CSC matrix format
  'is in the CSC matrix format', SparseEfficiencyWarning)
Out[414]: 
array([[ 26.11275413,  -4.17749006,  -9.82626551],
       [-37.22611759,   9.38404027,  13.80073216],
       [  7.59314843,  -2.04314605,  -1.58410661]])

所以使用csc 格式而不是csr

In [415]: A1=sparse.csc_matrix(a)
In [416]: linalg.inv(A1).A
Out[416]: 
array([[ 26.11275413,  -4.17749006,  -9.82626551],
       [-37.22611759,   9.38404027,  13.80073216],
       [  7.59314843,  -2.04314605,  -1.58410661]])

同样的事情,但没有稀疏警告。在不深入细节的情况下,inv 必须使用一种迭代列而不是行的方法。它确实是spsolve(A, I)I 是一个稀疏的eye 矩阵)。

【讨论】:

  • 太好了,谢谢。您能否详细说明使用csccsr 之间的主要区别?我主要使用csr 作为遗留代码的格式。
  • csc 基本上是csr 的转置。事实上M.T,其中Mcsr,是csc,具有相同的数据和指针。查看它们的dataindicesindptr 属性。
  • 非常有帮助 - 我无法快速确定与 scipy 文档的区别。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2021-11-25
  • 2012-01-10
相关资源
最近更新 更多