最大奇异值NumPy`ndarray`

时间:2017-02-18 15:47:37

标签: python numpy scipy svd

我有一个大的二维ndarrayA,我想计算SVD检索最大特征值和相关的特征向量对。看看NumPy文档,似乎NumPy只能计算完整的SVD(numpy.linalg.svd),而SciPy的方法完全符合我的要求(scipy.sparse.linalg.svds),但是使用稀疏矩阵而我不想要执行A的转换,因为它需要额外的计算时间。

到目前为止,我已直接在svds上使用了SciPy A,但文档不鼓励将ndarray传递给这些方法。

有没有办法使用接受ndarray个对象的方法执行此任务?

1 个答案:

答案 0 :(得分:4)

如果svds适用于密集的A数组,则继续使用它。你不需要把它转换成任何东西。 svds完成所需的所有调整。

它的文件说

  

A:{稀疏矩阵,LinearOperator}           用于计算形状(M,N)

的SVD的数组

但什么是LinearOperator?它是可以执行矩阵产品的包装器。对于密集阵列A.dot符合条件。

查看svds的代码。如果A = np.asarray(A)已经不是线性算子或稀疏矩阵,那么第一件事就是A。然后它抓取A.dot(hemetianA).dot并创建一个新的LinearOperator。

这个函数中的稀疏矩阵没有什么特别之处。重要的是拥有兼容的矩阵产品。

看看这些时间:

In [358]: A=np.eye(10)
In [359]: Alg=splg.aslinearoperator(A)
In [360]: Am=sparse.csr_matrix(A)
In [361]: timeit splg.svds(A)
1000 loops, best of 3: 541 µs per loop
In [362]: timeit splg.svds(Alg)
1000 loops, best of 3: 964 µs per loop
In [363]: timeit splg.svds(Am)
1000 loops, best of 3: 939 µs per loop

直接使用A的速度最快。转换不会有帮助,即使它们不属于时序循环。