左逆在numpy还是scipy?

2024-06-12 04:00:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用numpy或scipy在python中获得非方矩阵的左逆。 如何将下面的Matlab代码转换为Python?

>> A = [0,1; 0,1; 1,0]

A =

     0     1
     0     1
     1     0

>> y = [2;2;1]

y =

     2
     2
     1

>> A\y

ans =

    1.0000
    2.0000

在Matlab中是否存在左逆\算子的numpy或scipy等价物?


Tags: 代码numpy矩阵scipymatlab算子ans
3条回答

对于那些希望解决大型稀疏最小二乘问题的人:

我已将LSQR算法添加到SciPy中。在下一个版本中,您将能够:

from scipy.sparse import csr_matrix
from scipy.sparse.linalg import lsqr
import numpy as np

A = csr_matrix([[0., 1], [0, 1], [1, 0]])
b = np.array([[2.], [2.], [1.]])

lsqr(A, b)

它返回答案[1, 2]

如果您想在不升级SciPy的情况下使用这个新功能,可以从位于

http://projects.scipy.org/scipy/browser/trunk/scipy/sparse/linalg/isolve/lsqr.py

这里有一个方法可以处理稀疏矩阵(从注释中可以得到您想要的结果),它使用优化包中的leastsq函数

from numpy import *
from scipy.sparse import csr_matrix
from scipy.optimize import leastsq
from numpy.random import rand

A=csr_matrix([[0.,1.],[0.,1.],[1.,0.]])
b=array([[2.],[2.],[1.]])

def myfunc(x):
    x.shape = (2,1)
    return (A*x - b)[:,0]

print leastsq(myfunc,rand(2))[0]

产生

[ 1.  2.]

这有点难看,因为我必须让形状符合莱斯特的要求。也许其他人知道怎么把这个弄得更整洁一点。

我还试图通过使用LinearOperators来使用scipy.sparse.linalg中的函数,但没有成功。问题是,所有这些函数都只用于处理平方函数。如果有人想这样做,我也想知道。

使用linalg.lstsq(A,y),因为A不是正方形。有关详细信息,请参见here。如果A是方形的,则可以使用linalg.solve(A,y),但在您的情况下不能。

相关问题 更多 >