numpy.linalg.svd没有按降序返回Sigma

时间:2012-08-28 20:59:38

标签: python sorting numpy svd

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

然而,在我的测试中,sigma值显得无序。所以我的问题是,由于某些原因,我的linalg中出现了什么问题(我不太可能知道),或者它是否只是将sigma作为无序返回?

后续问题是对sigma进行排序的最佳方式,以便U和V ^ T中的顺序也反映出变化。

1 个答案:

答案 0 :(得分:1)

由于linalg.svd只是LAPACK dgesdd的接口,因此应该对单数值进行排序。

>>> 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 bug。