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

Jay*_*Jay 2 python numpy linear-algebra

给定一个 5x4 矩阵 A =

\n\n

在此输入图像描述

\n\n

一段构造矩阵的Python代码

\n\n
A = np.array([[1, 0, 0, 0],\n              [0, 0, 0, 4],\n              [0, 3, 0, 0],\n              [0, 0, 0, 0],\n              [2, 0, 0, 0]])\n
Run Code Online (Sandbox Code Playgroud)\n\n

Wolframalpha给出 svd 结果

\n\n

在此输入图像描述

\n\n

具有奇异值 \xce\xa3 的向量采用这种形式

\n\n

在此输入图像描述

\n\n

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

\n\n
[ 4.          3.          2.23606798 -0.        ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有办法让 numpy.linalg.svd 的输出数量显示为 Wolframalpha?

\n

Eri*_*ric 5

您可以通过以下方式完成大部分工作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.        ]])
Run Code Online (Sandbox Code Playgroud)

请注意,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.        ]])
Run Code Online (Sandbox Code Playgroud)

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

>>> u, s, vh = np.linalg.svd(a, full_matrices=False)
Run Code Online (Sandbox Code Playgroud)