python - numpy.linalg.svd 不按降序返回西格玛

标签 python sorting numpy svd

我目前正在使用 numpy.linalg 的 svd 函数在大矩阵(准确地说是图像)上计算 SVD。我发现的文档和示例似乎都表明返回的 Sigma 值按降序排序(暗示 U 和 V^T 的正确排序)。

但是,在我的测试中,西格玛值似乎是无序的。所以我的问题是,是否由于某种原因我的 linalg 出了问题(我知道极不可能),或者它只是将西格玛返回为无序?

后续问题是对 sigma 进行排序的最佳方法,以便 U 和 V^T 中的顺序也反射(reflect)变化。

最佳答案

由于 linalg.svd 只是 LAPACK dgesdd 的接口(interface),因此应该对奇异值进行排序。

>>> import numpy as np
>>> A = np.random.randn(2400,3600)
>>> U, s, V = np.linalg.svd(A, full_matrices=False)
>>> np.allclose(A, np.dot(U*s, V))
True
>>> (s[:-1] >= s[1:]).all()
True

如果您得到无序结果,请检查结果是否正确,如上例所示。如果没有,您可能有 lapack bug或(不太可能)是一个 NumPy 的错误。

关于python - numpy.linalg.svd 不按降序返回西格玛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167439/

相关文章:

python - 添加 ndarray 和在 python 中转换为密集的稀疏矩阵时出现广播错误

c - 3 路快速排序(C 实现)

python - 数据框如何按字母顺序将值从 a 排序到 b 而不是 aa

python - 按键对字典进行排序(键是带有数字的字符串)

python - 使用 float 索引合并两个 Pandas 数据帧

python - python中的小语言

python - Lambda 函数翻译

javascript - 使用 jQuery 和变量的问题

python - 有没有办法用 numpy 有效地反转矩阵数组?

python - 定义 numpy 索引数组