如何在numpy.linalg.solve中使用稀疏矩阵

时间:2017-03-01 09:40:47

标签: python numpy scipy sparse-matrix

我想为x

解决以下线性系统
Ax = b

其中A是稀疏的,b是常规列矩阵。但是,当我插入通常的np.linalg.solve(A,b)例程时,它会给我一个错误。但是,当我np.linalg.solve(A.todense(),b)时,它工作正常。

问题。

如何使用此线性求解仍然保留sparseness的{​​{1}}?原因是A关于A非常大,并且大约有50个这样的矩阵,所以尽可能长时间保持稀疏是我喜欢的方式。

我希望我的问题有道理。我该如何实现这个目标呢?

2 个答案:

答案 0 :(得分:2)

使用scipy来处理稀疏矩阵。您可以使用scipy.sparse.linalg.spsolve来执行此操作。有关详细信息,请阅读其文档spsolve

答案 1 :(得分:1)

np.linalg.solve仅适用于类似数组的对象。例如,它适用于np.ndarraynp.matrix(来自numpy文档的示例):

import numpy as np

a = np.array([[3,1], [1,2]])
b = np.array([9,8])
x = np.linalg.solve(a, b)

import numpy as np

a = np.matrix([[3,1], [1,2]])
b = np.array([9,8])
x = np.linalg.solve(a, b)

或在A.todense()A=scipy.sparse.csr_matrix(np.matrix([[3,1], [1,2]])),因为这会返回np.matrix个对象。

要使用稀疏矩阵,您必须使用scipy.sparse.linalg.spsolve(正如rakesh已经指出的那样)

import numpy as np
import scipy.sparse
import scipy.sparse.linalg

a = scipy.sparse.csr_matrix(np.matrix([[3,1], [1,2]]))
b = np.array([9,8])
x = scipy.sparse.linalg.spsolve(a, b)

请注意,x仍然是np.ndarray,而不是稀疏矩阵。只有当你解决Ax = b时,才会返回一个稀疏矩阵,其中b是一个矩阵,而不是一个向量。