2016-07-03 15 views
6

La saggezza ricevuta è di preferire le funzioni scipy.linalg su numpy.linalg. Per fare l'algebra lineare, idealmente (e convenientemente) mi piacerebbe combinare le funzionalità di numpy.array e scipy.linalg senza mai guardare verso numpy.linalg. Questo non è sempre possibile e può diventare troppo frustrante.Come sapere quando usare numpy.linalg invece di scipy.linalg?

Esiste una lista di controllo comparativa di funzioni equivalenti di questi due moduli per determinare rapidamente quando utilizzare numpy.linalg nel caso in cui una funzione sia assente in scipy.linalg?

ad es. Ci sono scipy.linalg.norm() e numpy.linalg.norm(), ma sembra che non ci siano equivalenti scipy di numpy.linalg.matrix_rank() e numpy.linalg.cond().

risposta

8

Quindi, la regola normale è utilizzare solo scipy.linalg poiché generalmente supporta tutte le funzionalità numpy.linalg e altro. Il documentation dice questo:

Vedere anche

numpy.linalg per ulteriori funzioni di algebra lineare. Notare che sebbene scipy.linalg importi la maggior parte di esse, le funzioni con nome identico da scipy.linalg potrebbero offrire funzionalità più o leggermente diverse.

Tuttavia, matrix_rank() è solo in NumPy.

Qui possiamo vedere le differenze tra le funzioni fornite da entrambe le librerie, e come SciPy è più completa:

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]: 

Nota che non tutti questi sono funzioni.

SciPy fornisce scipy.linalg.expm_cond(), ma restituisce solo la condizione nella norma di Frobenius, mentre numpy.linalg.cond() supporta più norme.

Problemi correlati