使用scipy计算矩阵秩

Hoo*_*ked 40 python numpy matrix scipy

我想用scipy 计算矩阵的数学等级.最明显的函数numpy.rank计算数组的维数(即标量有维度0,向量1,矩阵2等).我知道该numpy.linalg.lstsq模块具有此功能,但我想知道这样的基本操作是否内置于矩阵类中.

这是一个明确的例子:

from numpy import matrix, rank
A = matrix([[1,3,7],[2,8,3],[7,8,1]])
print rank(A)
Run Code Online (Sandbox Code Playgroud)

这给出2了维度,我正在寻找答案3.

Sim*_*mon 55

Numpy提供numpy.linalg.matrix_rank():

>>> import numpy
>>> numpy.__version__
'1.5.1'
>>> A = numpy.matrix([[1,3,7],[2,8,3],[7,8,1]])
>>> numpy.linalg.matrix_rank(A)
3
Run Code Online (Sandbox Code Playgroud)

  • 如何找到**整数**矩阵的等级**模数n**?在Mathematica中有这个函数MatrixRank [...,Modulus - > n],但是如何在Python中实现这个功能呢? (2认同)

Ste*_*alt 14

为需要在实践中完成此操作的人提供粗略的代码段.随意改进.

u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)
Run Code Online (Sandbox Code Playgroud)


Esc*_*alo 5

如果numpy没有提供等级设施,你为什么不自己编写?

计算秩的有效方法是通过奇异值分解 - 矩阵的秩等于非零奇异值的数量.

def rank(A, eps=1e-12):
    u, s, vh = numpy.linalg.svd(A)
    return len([x for x in s if abs(x) > eps])
Run Code Online (Sandbox Code Playgroud)

请注意,eps取决于您的应用程序 - 大多数人会同意1e-12对应于零,但即使对于eps = 1e-9,您也可能会看到数值不稳定.

使用您的示例,答案是三个.如果将第二行更改为[2, 6, 14](与第一行线性相关),则答案为2("零"特征值为4.9960E-16)