Numpy spsolve和solve的意外差异

Numpy spsolve和solve的意外差异,numpy,scipy,sparse-matrix,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时会出

我需要解各种大小的线性方程组。有时大小可能为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的大小不是零。

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

使用
numpy.至少\u 2d
膨胀向量,例如,在您的示例中

In [10]: np.atleast_2d(spsolve(A1,b1)).T
Out[10]: 
array([[ 0.33333333],
       [ 0.33333333]])
.T
以获得列(2d)向量。这可能也解决了第二个问题,与结果向量的深度有关


(我不使用sage,因此无法重现您的错误。)

有趣。我在python-2.6上尝试了您的方法,它可以正常工作,没有任何错误。但在Sage-5.3中,它总是弹出错误消息:“97 options=dict(ColPerm=permc_spec)98 return\u superlu.gssv(N,A.nnz,A.data,A.index,A.indptr,b,flag,-->99 options=options)[0]100 101 def splu(A,permc\u spec=None,diag\u pivot\u thresh=None,ValueError:对于所需数组,对象深度太小”