spsolve和solve的意外差异

时间:2013-04-12 03:17:08

标签: numpy scipy sparse-matrix

我需要求解不同大小的线性方程。有时大小可能是0或1,在这种情况下会发生一些错误。例如,

import numpy as np
from numpy.linalg import solve
from scipy.sparse.linalg import spsolve
A1 = np.array([[1,2],[2,1]])
b1 = np.array([[1],[1]])
A2 = np.array([[1]])
b2 = np.array([[1]])

调用spsolve或solve时会发生一些意想不到的结果:

sage: solve(A1,b1)
array([[ 0.33333333],
       [ 0.33333333]])
sage: solve(A2,b2)
array([[ 1.]])
sage: spsolve(A1,b1)
array([ 0.33333333,  0.33333333])
sage: spsolve(A2,b2)
ValueError: object of too small depth for desired array

请注意,调用“spsolve(A1,b1)”实际上会产生一个行向量,无论如何都要强制它成为列向量?此外,调用“spsolve(A2,b2)”时的错误也很奇怪,因为A1和b1的大小不为零。

1 个答案:

答案 0 :(得分:1)

spsolve不返回2d数组,而是返回1d向量。

使用numpy.atleast_2d对矢量进行充气,例如,在您的示例中

In [10]: np.atleast_2d(spsolve(A1,b1)).T
Out[10]: 
array([[ 0.33333333],
       [ 0.33333333]])

.T获取列(2d)向量。这可能也解决了你的第二个问题,与结果向量的深度有关。

(我不使用圣人,所以我无法重现你的错误。)