获取np.linalg.svd的奇异值作为矩阵

时间:2019-06-23 22:28:44

标签: python numpy linear-algebra

给出一个5x4矩阵A =

enter image description here

一段用于构建矩阵的python代码

A = np.array([[1, 0, 0, 0],
              [0, 0, 0, 4],
              [0, 3, 0, 0],
              [0, 0, 0, 0],
              [2, 0, 0, 0]])

wolframalpha给出svd结果

enter image description here

奇异值Σ的向量为这种形式

enter image description here

np.linalg.svd输出中的等价量(NumPy称为s)采用这种形式

[ 4.          3.          2.23606798 -0.        ]

是否有一种方法可以使numpy.linalg.svd输出中的数量显示为wolframalpha?

1 个答案:

答案 0 :(得分:3)

您可以使用diag到达那里的大部分方式:

>>> u, s, vh = np.linalg.svd(a)
>>> np.diag(s)
array([[ 4.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  3.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  2.23606798,  0.        ],
       [ 0.        ,  0.        ,  0.        , -0.        ]])

请注意,Wolfram Alpha额外增加了一行。要获得更多的参与是

>>> sigma = np.zeros(A.shape, s.dtype)
>>> np.fill_diagonal(sigma, s)
>>> sigma
array([[ 4.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  3.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  2.23606798,  0.        ],
       [ 0.        ,  0.        ,  0.        , -0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ]])

根据您的目标,从U中删除列可能比在sigma中添加零行更好。看起来像:

>>> u, s, vh = np.linalg.svd(a, full_matrices=False)