何时使用numpy.linalg而不是scipy.linalg?

8

通常认为优先选择scipy.linalg而不是numpy.linalg函数。为了进行线性代数运算,理想情况下(也很方便),我希望结合numpy.arrayscipy.linalg的功能,在不使用numpy.linalg的情况下完成任务。但这并非总是可能的,并且可能会变得过于令人沮丧。

是否有一个比较功能列表,从这两个模块中确定何时在scipy.linalg中不存在一个函数时使用numpy.linalg?

例如,有scipy.linalg.norm()numpy.linalg.norm(),但是似乎没有scipy等价的numpy.linalg.matrix_rank()numpy.linalg.cond()

1个回答

13
因此,通常的规则是只使用scipy.linalg,因为它通常支持所有的numpy.linalg功能以及更多功能。 文档中说:

另请参见

更多的线性代数函数,请参考numpy.linalg。请注意,尽管scipy.linalg导入了大部分这些函数,但来自scipy.linalg的同名函数可能提供更多或略有不同的功能。

然而,matrix_rank()仅在NumPy中提供。

在这里,我们可以看到两个库提供的函数之间的差异,以及SciPy是如何更加完整的。

In [2]: from scipy import linalg as scipy_linalg
In [3]: from numpy import linalg as numpy_linalg
In [4]: dir(scipy_linalg)
Out[4]:
[
 ...
 'absolute_import',
 'basic',
 'bench',
 'blas',
 'block_diag',
 'cho_factor',
 'cho_solve',
 'cho_solve_banded',
 'cholesky',
 'cholesky_banded',
 'circulant',
 'companion',
 'coshm',
 'cosm',
 'cython_blas',
 'cython_lapack',
 'decomp',
 'decomp_cholesky',
 'decomp_lu',
 'decomp_qr',
 'decomp_schur',
 'decomp_svd',
 'det',
 'dft',
 'diagsvd',
 'division',
 'eig',
 'eig_banded',
 'eigh',
 'eigvals',
 'eigvals_banded',
 'eigvalsh',
 'expm',
 'expm2',
 'expm3',
 'expm_cond',
 'expm_frechet',
 'find_best_blas_type',
 'flinalg',
 'fractional_matrix_power',
 'funm',
 'get_blas_funcs',
 'get_lapack_funcs',
 'hadamard',
 'hankel',
 'helmert',
 'hessenberg',
 'hilbert',
 'inv',
 'invhilbert',
 'invpascal',
 'kron',
 'lapack',
 'leslie',
 'linalg_version',
 'logm',
 'lstsq',
 'lu',
 'lu_factor',
 'lu_solve',
 'matfuncs',
 'misc',
 'norm',
 'ordqz',
 'orth',
 'orthogonal_procrustes',
 'pascal',
 'pinv',
 'pinv2',
 'pinvh',
 'polar',
 'print_function',
 'qr',
 'qr_delete',
 'qr_insert',
 'qr_multiply',
 'qr_update',
 'qz',
 'rq',
 'rsf2csf',
 's',
 'schur',
 'signm',
 'sinhm',
 'sinm',
 'solve',
 'solve_banded',
 'solve_circulant',
 'solve_continuous_are',
 'solve_discrete_are',
 'solve_discrete_lyapunov',
 'solve_lyapunov',
 'solve_sylvester',
 'solve_toeplitz',
 'solve_triangular',
 'solveh_banded',
 'special_matrices',
 'sqrtm',
 'svd',
 'svdvals',
 'tanhm',
 'tanm',
 'test',
 'toeplitz',
 'tri',
 'tril',
 'triu']

In [5]: dir(numpy_linalg)
Out[5]:
[
 ...
 'absolute_import',
 'bench',
 'cholesky',
 'cond',
 'det',
 'division',
 'eig',
 'eigh',
 'eigvals',
 'eigvalsh',
 'info',
 'inv',
 'lapack_lite',
 'linalg',
 'lstsq',
 'matrix_power',
 'matrix_rank',
 'multi_dot',
 'norm',
 'pinv',
 'print_function',
 'qr',
 'slogdet',
 'solve',
 'svd',
 'tensorinv',
 'tensorsolve',
 'test']

In [6]:

请注意,这并非全部是函数。

SciPy提供了scipy.linalg.expm_cond(),但它仅返回Frobenius范数中的条件,而numpy.linalg.cond()支持多个范数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接