我不认为稀疏模块有明确的逆方法,但它确实有稀疏求解器。类似这个玩具例子的东西可以工作:
>>> a = np.random.rand(3, 3)
>>> a
array([[ 0.31837307, 0.11282832, 0.70878689],
[ 0.32481098, 0.94713997, 0.5034967 ],
[ 0.391264 , 0.58149983, 0.34353628]])
>>> np.linalg.inv(a)
array([[-0.29964242, -3.43275347, 5.64936743],
[-0.78524966, 1.54400931, -0.64281108],
[ 1.67045482, 1.29614174, -2.43525829]])
>>> a_sps = scipy.sparse.csc_matrix(a)
>>> lu_obj = scipy.sparse.linalg.splu(a_sps)
>>> lu_obj.solve(np.eye(3))
array([[-0.29964242, -0.78524966, 1.67045482],
[-3.43275347, 1.54400931, 1.29614174],
[ 5.64936743, -0.64281108, -2.43525829]])
请注意,结果已经转置了!
如果您希望反函数也是稀疏的,并且从最后一个求解返回的密集矩阵无法适合内存,那么您也可以逐行(列)生成它,提取非零值,并从中构建稀疏逆矩阵。
>>> for k in xrange(3) :
... b = np.zeros((3,))
... b[k] = 1
... print lu_obj.solve(b)
...
[-0.29964242 -0.78524966 1.67045482]
[-3.43275347 1.54400931 1.29614174]
[ 5.64936743 -0.64281108 -2.43525829]
scipy
文档中提到您不需要将矩阵稠密化,所以我有点困惑。http://docs.scipy.org/doc/scipy-0.8.x/reference/sparse.html - BenDundee