【问题标题】:How to know when to use numpy.linalg instead of scipy.linalg?如何知道何时使用 numpy.linalg 而不是 scipy.linalg?
【发布时间】:2016-11-05 04:48:09
【问题描述】:

公认的智慧是更喜欢scipy.linalg 而不是numpy.linalg 函数。对于线性代数,理想情况下(并且方便地)我想结合numpy.arrayscipy.linalg 的功能,而无需考虑numpy.linalg。这并不总是可能的,并且可能会变得太令人沮丧。

如果scipy.linalg 中缺少某个功能,是否有这两个模块的等效功能的比较清单来快速确定何时使用numpy.linalg

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

【问题讨论】:

    标签: python arrays numpy scipy


    【解决方案1】:

    因此,通常的规则是只使用scipy.linalg,因为它通常支持所有numpy.linalg 功能等等。 documentation 是这样说的:

    另请参阅

    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() 支持多种范数。

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 1970-01-01
      • 2016-05-08
      • 2020-02-22
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多