SciPy semble fournir la plupart (mais pas toutes [1]) des fonctions de NumPy dans son propre espace de noms. En d'autres termes, s'il y a une fonction nommée numpy.foo
, il y a presque certainement un scipy.foo
. La plupart du temps, les deux semblent être exactement les mêmes, pointant souvent vers le même objet fonction.
Parfois, ils sont différents. Pour donner un exemple qui est apparu récemment:
numpy.log10
est un ufunc qui retourne NaNs pour les arguments négatifs;scipy.log10
renvoie des valeurs complexes pour les arguments négatifs et ne semble pas être un ufunc.
La même chose peut être dit au sujet log
, log2
et logn
, mais pas log1p
[2].
D'autre part, numpy.exp
et scipy.exp
semblent être des noms différents pour le même ufunc. Cela vaut également pour scipy.log1p
et numpy.log1p
.
Un autre exemple est numpy.linalg.solve
vs scipy.linalg.solve
. Ils sont similaires, mais le dernier offre des fonctionnalités supplémentaires par rapport au premier.
Pourquoi cette duplication apparente? Si cela est censé être une importation en gros de numpy
dans l' scipy
espace de noms, pourquoi les différences subtiles de comportement et les fonctions manquantes? Y a-t-il une logique globale qui aiderait à dissiper la confusion?
[1] numpy.min
, numpy.max
, numpy.abs
et quelques autres ont pas d' équivalent dans l' scipy
espace de noms.
[2] Testé avec NumPy 1.5.1 et SciPy 0.9.0rc2.
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 articles sur numpy et scipy et que je l'utilise moi-même. Et je vois presque toujours numpy importé séparément (comme np). Alors ils ont échoué?Réponses:
La dernière fois que je l'ai vérifié, la
__init__
méthode scipy exécute unde sorte que tout l'espace de noms numpy soit inclus dans scipy lorsque le module scipy est importé.
Le
log10
comportement que vous décrivez est intéressant, car les deux versions proviennent de numpy. L'un est unufunc
, l'autre est unenumpy.lib
fonction. Pourquoi scipy préfère la fonction de bibliothèque à laufunc
, je ne sais pas du haut de ma tête.EDIT: En fait, je peux répondre à la
log10
question. En regardant dans la__init__
méthode scipy , je vois ceci:La
log10
fonction que vous obtenez dans scipy vient denumpy.lib.scimath
. En regardant ce code, il dit:Il semble que les superpositions de module les ufuncs de numpy de base pour
sqrt
,log
,log2
,logn
,log10
,power
,arccos
,arcsin
etarctanh
. Cela explique le comportement que vous voyez. La raison sous-jacente de la conception pour laquelle cela est fait comme ça est probablement enfouie quelque part dans une liste de diffusion.la source
Dans le Guide de référence SciPy:
L'intention est que les utilisateurs n'aient pas à connaître la distinction entre les espaces de noms
scipy
etnumpy
, bien qu'apparemment vous ayez trouvé une exception.la source
Il semble d'après la FAQ SciPy que certaines fonctions de NumPy sont là pour des raisons historiques alors qu'elles ne devraient l'être que dans SciPy:
Cela explique pourquoi
scipy.linalg.solve
propose quelques fonctionnalités supplémentairesnumpy.linalg.solve
.Je n'ai pas vu la réponse de SethMMorton à la question connexe
la source
Il y a un petit commentaire à la fin de l' introduction de la documentation SciPy :
Je pense que cela permettra à quelqu'un ayant suffisamment de connaissances de tous les packages impliqués de choisir exactement les différences entre certaines fonctions scipy et numpy (cela ne m'a pas du tout aidé avec la question log10). Je n'ai certainement pas cette connaissance mais l'
source
indiquescipy.linalg.solve
etnumpy.linalg.solve
interagis avec lapack de différentes manières;C'est aussi mon premier article, donc si je devais changer quelque chose ici, faites le moi savoir.
la source
Sur Wikipedia ( http://en.wikipedia.org/wiki/NumPy#History ):
scipy
dépendnumpy
et importe de nombreusesnumpy
fonctions dans son espace de noms pour plus de commodité.la source
Concernant le paquet linalg - les fonctions scipy appellent lapack et blas, qui sont disponibles en versions hautement optimisées sur de nombreuses plateformes et offrent de très bonnes performances, en particulier pour les opérations sur des matrices denses assez grandes. D'un autre côté, ce ne sont pas des bibliothèques faciles à compiler, nécessitant un compilateur fortran et de nombreux ajustements spécifiques à la plate-forme pour obtenir des performances complètes. Par conséquent, numpy fournit des implémentations simples de nombreuses fonctions d'algèbre linéaire communes qui sont souvent assez bonnes pour de nombreuses applications.
la source
dual
: "Ce module devrait être utilisé pour les fonctions à la fois dans numpy et scipy si vous voulez utiliser la version numpy si disponible mais la version scipy sinon." Utilisation ---from numpy.dual import fft, inv
Tiré de conférences sur « l'économie quantitative »
SciPy est un package qui contient divers outils qui sont construits au-dessus de NumPy, en utilisant son type de données de tableau et les fonctionnalités associées
En fait, lorsque nous importons SciPy, nous obtenons également NumPy, comme le montre le fichier d'initialisation SciPy
Cependant, il est plus courant et préférable d'utiliser explicitement la fonctionnalité NumPy
Ce qui est utile dans SciPy, c'est la fonctionnalité de ses sous-packages
la source
En plus de la FAQ SciPy décrivant la duplication est principalement pour la compatibilité descendante, il est précisé dans la documentation NumPy pour dire que
Par souci de concision, ce sont:
En outre, à partir du didacticiel SciPy :
Ainsi, pour les nouvelles applications, vous devriez préférer la version NumPy des opérations de la baie qui sont dupliquées au niveau supérieur de SciPy. Pour les domaines répertoriés ci-dessus, vous devriez préférer ceux de SciPy et vérifier la compatibilité descendante si nécessaire dans NumPy.
D'après mon expérience personnelle, la plupart des fonctions de tableau que j'utilise existent au niveau supérieur de NumPy (à l'exception de
random
). Cependant, toutes les routines spécifiques au domaine existent dans des sous-packages de SciPy, donc j'utilise rarement quoi que ce soit du niveau supérieur de SciPy.la source