numpy或scipy中的左逆?

15 投票
7 回答
13032 浏览
提问于 2025-04-15 19:11

我想在Python中使用numpy或scipy来获取一个非方阵的左逆矩阵。请问如何把下面的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

在Python中,有没有类似于Matlab中左逆运算符\的功能呢?

7 个回答

2

这里有一个方法可以处理稀疏矩阵(根据你的评论,这正是你想要的),它使用了优化包中的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.]

这个方法看起来有点复杂,因为我不得不调整形状以符合leastsq的要求。也许其他人知道怎么让这个过程更简单一些。

我还尝试过使用scipy.sparse.linalg中的函数,利用LinearOperators来实现,但没有成功。问题在于那些函数都是为了处理方形函数而设计的。如果有人找到其他方法,我也很想知道。

2

你也可以在 numpy/scipy 中找找和伪逆函数 pinv 相对应的功能,这也是一种可以考虑的选择,跟其他答案相比。

11

因为 A 不是一个正方形的矩阵,所以你应该使用 linalg.lstsq(A,y)。想了解更多信息,可以查看 这里。如果 A 是正方形的矩阵,你可以使用 linalg.solve(A,y),但在你的情况下不适用。

撰写回答