Il y a un court commentaire à la fin de l'article. introduction à SciPy documentation :
Une autre commande utile est source
. Lorsqu'on lui donne comme argument une fonction écrite en Python, il imprime une liste du code source de cette fonction. Cela peut être utile pour apprendre un algorithme ou comprendre exactement ce qu'une fonction fait avec ses arguments. fait avec ses arguments. N'oubliez pas non plus la commande Python dir qui peut être qui permet de consulter l'espace de noms d'un module ou d'un paquetage.
Je pense que cela permettra à quelqu'un ayant une connaissance suffisante de tous les paquets concernés de distinguer exactement les différences entre un peu de les fonctions scipy et numpy (cela ne m'a pas du tout aidé pour la question log10). Je n'ai certainement pas ces connaissances mais source
indique que scipy.linalg.solve
y numpy.linalg.solve
interagissent avec lapack de différentes manières ;
Python 2.4.3 (#1, May 5 2011, 18:44:23)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
>>> import scipy
>>> import scipy.linalg
>>> import numpy
>>> scipy.source(scipy.linalg.solve)
In file: /usr/lib64/python2.4/site-packages/scipy/linalg/basic.py
def solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0,
debug = 0):
""" solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0) -> x
Solve a linear system of equations a * x = b for x.
Inputs:
a -- An N x N matrix.
b -- An N x nrhs matrix or N vector.
sym_pos -- Assume a is symmetric and positive definite.
lower -- Assume a is lower triangular, otherwise upper one.
Only used if sym_pos is true.
overwrite_y - Discard data in y, where y is a or b.
Outputs:
x -- The solution to the system a * x = b
"""
a1, b1 = map(asarray_chkfinite,(a,b))
if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]:
raise ValueError, 'expected square matrix'
if a1.shape[0] != b1.shape[0]:
raise ValueError, 'incompatible dimensions'
overwrite_a = overwrite_a or (a1 is not a and not hasattr(a,'__array__'))
overwrite_b = overwrite_b or (b1 is not b and not hasattr(b,'__array__'))
if debug:
print 'solve:overwrite_a=',overwrite_a
print 'solve:overwrite_b=',overwrite_b
if sym_pos:
posv, = get_lapack_funcs(('posv',),(a1,b1))
c,x,info = posv(a1,b1,
lower = lower,
overwrite_a=overwrite_a,
overwrite_b=overwrite_b)
else:
gesv, = get_lapack_funcs(('gesv',),(a1,b1))
lu,piv,x,info = gesv(a1,b1,
overwrite_a=overwrite_a,
overwrite_b=overwrite_b)
if info==0:
return x
if info>0:
raise LinAlgError, "singular matrix"
raise ValueError,\
'illegal value in %-th argument of internal gesv|posv'%(-info)
>>> scipy.source(numpy.linalg.solve)
In file: /usr/lib64/python2.4/site-packages/numpy/linalg/linalg.py
def solve(a, b):
"""
Solve the equation ``a x = b`` for ``x``.
Parameters
----------
a : array_like, shape (M, M)
Input equation coefficients.
b : array_like, shape (M,)
Equation target values.
Returns
-------
x : array, shape (M,)
Raises
------
LinAlgError
If `a` is singular or not square.
Examples
--------
Solve the system of equations ``3 * x0 + x1 = 9`` and ``x0 + 2 * x1 = 8``:
>>> a = np.array([[3,1], [1,2]])
>>> b = np.array([9,8])
>>> x = np.linalg.solve(a, b)
>>> x
array([ 2., 3.])
Check that the solution is correct:
>>> (np.dot(a, x) == b).all()
True
"""
a, _ = _makearray(a)
b, wrap = _makearray(b)
one_eq = len(b.shape) == 1
if one_eq:
b = b[:, newaxis]
_assertRank2(a, b)
_assertSquareness(a)
n_eq = a.shape[0]
n_rhs = b.shape[1]
if n_eq != b.shape[0]:
raise LinAlgError, 'Incompatible dimensions'
t, result_t = _commonType(a, b)
# lapack_routine = _findLapackRoutine('gesv', t)
if isComplexType(t):
lapack_routine = lapack_lite.zgesv
else:
lapack_routine = lapack_lite.dgesv
a, b = _fastCopyAndTranspose(t, a, b)
pivots = zeros(n_eq, fortran_int)
results = lapack_routine(n_eq, n_rhs, a, n_eq, pivots, b, n_eq, 0)
if results['info'] > 0:
raise LinAlgError, 'Singular matrix'
if one_eq:
return wrap(b.ravel().astype(result_t))
else:
return wrap(b.transpose().astype(result_t))
Il s'agit également de mon premier message, donc si je dois changer quelque chose ici, faites-le moi savoir.
8 votes
J'ai lu dans les réponses que
all of those functions are available without additionally importing Numpy
parce quethe intention is for users not to have to know the distinction between the scipy and numpy namespaces
. Maintenant je me demande, parce que je suis un peu les posts sur numpy et scipy et je les utilise moi-même. Et je vois presque toujours numpy être importé séparément (comme np). Alors ils ont échoué ?8 votes
Il y a quelques différences entre scipy et numpy dans les trucs de FFT, j'ai une fois été confronté à un problème qui s'est avéré être dû à une définition différente de la version de rfft de scipy et numpy.
1 votes
Les FFT de SciPy et NumPy sont différentes. SciPy utilise la bibliothèque Fortran FFTPACK, d'où le nom scipy.fftpack. NumPy utilise une bibliothèque C appelée fftpack_lite ; elle possède moins de fonctions et ne prend en charge que la double précision dans NumPy. Enthought inc. a corrigé son numpy.fft pour utiliser Intel MKL pour les FFT au lieu de fftpack_lite.
9 votes
NumPy s'appelait à l'origine scipy.core. NumPy et SciPy sont des projets étroitement liés. La principale raison de cette séparation est de s'assurer que la bibliothèque de tableaux (NumPy) est légère et efficace, car la majeure partie de SciPy n'est pas toujours nécessaire. En outre, les scientifiques ont décidé de retirer les paquets de tableaux numeric (MIT) et numarray (NASA) au profit de scipy.core, d'où le nom de NumPy. SciPy n'a toujours pas atteint la version 1.0, alors que NumPy est actuellement publié en version 1.8.1. NumPy possède quelques facilités pour les FFT et l'algèbre linéaire, mais pas aussi étendues que SciPy.
0 votes
@SturlaMolden bon à savoir sur Enthought, savez-vous si Anaconda optimise les deux ou seulement numpy ?
0 votes
@dashesy AFAIK, Anaconda n'utilise pas MKL pour les FFTs. Si je ne me trompe pas, leur add-on MKL optimise uniquement les opérations d'algèbre linéaire (BLAS et LAPACK).
0 votes
Remarque : à partir de SciPy 1.4.0, "la prise en charge des fonctions NumPy exposées via l'espace de noms SciPy racine est dépréciée et sera supprimée dans la version 2.0.0. Par exemple, si vous utilisez scipy.rand ou scipy.diag, vous devez modifier votre code pour utiliser directement numpy.random.default_rng ou numpy.diag, respectivement. Ils restent disponibles dans la série de versions Scipy 1.x qui se poursuit actuellement." github.com/scipy/scipy/releases/tag/v1.4.0