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

How to use a sparse matrix in numpy.linalg.solve

我想为 x

求解以下线性系统
Ax = b

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

问题。

如何使用此线性求解仍然保留 Asparseness?。原因是 A 关于 150 x 150 相当大,大约有 50 个这样的矩阵,所以尽可能长时间地保持稀疏是我更喜欢的方式。

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

使用 scipy 来处理稀疏 matrices.You 可以使用 scipy.sparse.linalg.spsolve 来做到这一点。有关详细信息,请阅读其文档 spsolve

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]])) 作为此 returns 一个 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 是矩阵而不是向量。