Python 确定稀疏矩阵商
我希望在python 2.7中划分两个稀疏矩阵,本质上是Python 确定稀疏矩阵商,python,performance,numpy,scipy,sparse-matrix,Python,Performance,Numpy,Scipy,Sparse Matrix,我希望在python 2.7中划分两个稀疏矩阵,本质上是k=分子/分母,结果是一个类型为sp.csr\u矩阵的稀疏矩阵。我正在使用scipy作为sp和numpy作为np 为了做到这一点,我遵循线性格式,取分子的点积和分母的倒数。这两个项目的格式均为sp.csr_矩阵([],([],[]),形状=[R,R]) k本身的计算是 k = sp.csr_matrix(numerator.dot(sp.linalg.inv(denominator))) 执行此操作将返回警告: SparseEfficie
k=分子/分母
,结果是一个类型为sp.csr\u矩阵
的稀疏矩阵。我正在使用scipy作为sp
和numpy作为np
为了做到这一点,我遵循线性格式,取分子的点积和分母的倒数。这两个项目的格式均为sp.csr_矩阵([],([],[]),形状=[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中,是否有更有效的方法生成稀疏矩阵和稀疏矩阵逆的点积(两个稀疏矩阵的商)
我以前发现过,但我想知道这是否已经过时。借用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
使用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
矩阵)。借用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
使用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
矩阵)。为什么2013年的答案会过时?您是否找到了任何sparse
inv
函数或讨论?我认为它可能已经过时,因为从那时起,scipy库中的更新创建了一个成员函数,但我找不到该函数。未发现有关稀疏反转的讨论。一条评论指出,sparse.linalg.inv
正在进行中-这在我的版本中存在。是的,我目前正在dot产品中使用sp.linalg.inv
,但是,我收到了问题中详细说明的警告,我主要想知道警告是否可能是3小时过去且终端未返回结果的原因……为什么2013年的答案会过时?您是否找到了任何sparse
inv
函数或讨论?我认为它可能已经过时,因为从那时起,scipy库中的更新创建了一个成员函数,但我找不到该函数。未发现有关稀疏反转的讨论。一条评论指出,sparse.linalg.inv
正在进行中-这在我的版本中存在。是的,我目前正在dot产品中使用sp.linalg.inv
,但是我收到了问题中详细的警告,我主要想知道警告是否是3个小时过去了,终端没有返回结果的原因…太好了,谢谢。您能否详细说明使用csc
与csr
的主要区别?我主要使用的是csr
,因为这是保存遗留代码的格式。csc
基本上是csr
的转置。实际上,M.T
其中M
是csr
,是csc
,具有相同的数据和指针。查看他们的数据
,索引
和indptr
属性。非常有用-我无法快速从scipy
文档中识别出区别。非常感谢。太好了,谢谢。您能否详细说明使用csc
与csr
的主要区别?我主要使用的是csr
,因为这是保存遗留代码的格式。csc
基本上是csr
的转置。实际上,M.T
其中M
是csr
,是csc
,具有相同的数据和指针。查看他们的数据
,索引
和indptr
属性。非常有用-我无法快速从scipy
文档中识别出区别。非常感谢。