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

时间:2016-07-03 08:15:02

标签: python arrays numpy scipy

接受的智慧是scipy.linalg优于numpy.linalg功能。对于线性代数,理想情况下(并且方便地)我想结合numpy.arrayscipy.linalg的功能,而不是期待numpy.linalg。这并不总是可行的,可能会变得太令人沮丧。

是否有来自这两个模块的等效函数的比较清单,以便在numpy.linalg中没有函数的情况下快速确定何时使用scipy.linalg

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

1 个答案:

答案 0 :(得分:8)

因此,正常规则是仅使用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()支持多个规范。