import numpy as np
import scipy as sp
data = np.random.random((3,3)) # a single matrix
data_array = np.random.random((10**6,3,3)) # one million matrices
# numpy svd
R,S,V = np.linalg.svd(data) # works
R,S,V = np.linalg.svd(data_array) # works
# scipy svd
R,S,V = sp.linalg.svd(data) # works
R,S,V = sp.linalg.svd(data_array) # fails !!!
3条答案
按热度按时间djmepvbi1#
在FAQ页面上,它说
scipy.linalg
子模块为Fortran LAPACK库提供了一个更完整的 Package 器,而numpy.linalg
试图能够独立于LAPACK进行构建。我为
svd
函数的不同实现做了一些benchmarks,发现scipy.linalg.svd
比numpy对应的更快:然而,jax Package 的numpy,又名
jax.numpy.linalg.svd
甚至更快:基准测试的完整笔记本可用于here。
kyks70gy2#
除了错误检查之外,实际的工作似乎是在lapack中使用
numpy
和scipy
完成的。在没有做任何基准测试的情况下,我猜性能应该是相同的。
zed5wv103#
另一个区别是
np.linalg.svd
可以在大型数据数组上进行向量化的svd
计算,其中sp.linalg.svd
一次只做1。例如:
我还没有对此进行基准测试,但两者之间的直接1:1比较可能会显示
sp.linalg.svd
的计算速度更快,而当您需要在大型数据数组上计算svd
时,np.linalg.svd
可能更快(或至少更方便)。