确定稀疏矩阵商
Determining a sparse matrix quotient
我想在 python 2.7 中划分两个稀疏矩阵,本质上是 k = numerator / denominator
,结果是 sp.csr_matrix
类型的稀疏矩阵。我正在使用 scipy as sp
和 numpy as np
。
为了做到这一点,我遵循线性格式计算分子的点积和分母的倒数。两项的格式均为 sp.csr_matrix(([],([],[])),shape=[R,R])
.
k 本身的计算是
k = sp.csr_matrix(numerator.dot(sp.linalg.inv(denominator)))
这样做returns警告:
SparseEfficiencyWarning: splu requires CSC matrix format
warn('splu requires CSC matrix format', SparseEfficiencyWarning)
关于确定 k
是两个稀疏矩阵之间的商,上述警告意味着什么 ?
有没有更高效的方法生成python中的稀疏矩阵与稀疏矩阵逆的点积(两个稀疏矩阵的商)?
我以前找到过 Inverting large sparse matrices with scipy,但我想知道这是否已过时。
借用 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
矩阵)。
我想在 python 2.7 中划分两个稀疏矩阵,本质上是 k = numerator / denominator
,结果是 sp.csr_matrix
类型的稀疏矩阵。我正在使用 scipy as sp
和 numpy as np
。
为了做到这一点,我遵循线性格式计算分子的点积和分母的倒数。两项的格式均为 sp.csr_matrix(([],([],[])),shape=[R,R])
.
k 本身的计算是
k = sp.csr_matrix(numerator.dot(sp.linalg.inv(denominator)))
这样做returns警告:
SparseEfficiencyWarning: splu requires CSC matrix format
warn('splu requires CSC matrix format', SparseEfficiencyWarning)
关于确定 k
是两个稀疏矩阵之间的商,上述警告意味着什么 ?
有没有更高效的方法生成python中的稀疏矩阵与稀疏矩阵逆的点积(两个稀疏矩阵的商)?
我以前找到过 Inverting large sparse matrices with scipy,但我想知道这是否已过时。
借用 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
矩阵)。