SciPy scheint die meisten (aber nicht alle [1]) Funktionen von NumPy in einem eigenen Namespace bereitzustellen. Mit anderen Worten, wenn es eine Funktion mit dem Namen numpy.foo
gibt, gibt es mit ziemlicher Sicherheit eine scipy.foo
. Meistens scheinen die beiden genau gleich zu sein und zeigen oft sogar auf dasselbe Funktionsobjekt.
Manchmal sind sie anders. Um ein Beispiel zu nennen, das kürzlich aufgetaucht ist:
numpy.log10
ist ein Ufunc , der NaNs für negative Argumente zurückgibt;scipy.log10
Gibt komplexe Werte für negative Argumente zurück und scheint kein Ufunc zu sein.
Das gleiche kann man über gesagt werden log
, log2
und logn
, aber nicht über log1p
[2].
Auf der anderen Seite numpy.exp
und scipy.exp
scheinen unterschiedliche Namen für die gleiche Ufunc zu sein. Dies gilt auch für scipy.log1p
und numpy.log1p
.
Ein weiteres Beispiel ist numpy.linalg.solve
vs scipy.linalg.solve
. Sie sind ähnlich, aber das letztere bietet einige zusätzliche Funktionen gegenüber dem ersteren.
Warum die offensichtliche Verdoppelung? Wenn dies ein Großhandelsimport numpy
in den scipy
Namespace sein soll, warum dann die subtilen Unterschiede im Verhalten und die fehlenden Funktionen? Gibt es eine übergreifende Logik, die helfen würde, die Verwirrung zu beseitigen?
[1] numpy.min
, numpy.max
, numpy.abs
und ein paar andere haben keine Entsprechungen im scipy
Namespace.
[2] Getestet mit NumPy 1.5.1 und SciPy 0.9.0rc2.
all of those functions are available without additionally importing Numpy
weilthe intention is for users not to have to know the distinction between the scipy and numpy namespaces
. Jetzt frage ich mich, weil ich den Posts über Numpy und Scipy ein bisschen folge und sie selbst benutze. Und ich sehe fast immer, dass Numpy separat importiert wird (als np). Also haben sie versagt?Antworten:
Als ich es das letzte Mal überprüft habe, führt die scipy-
__init__
Methode a ausDamit wird der gesamte Numpy-Namespace in scipy aufgenommen, wenn das scipy-Modul importiert wird.
Das von
log10
Ihnen beschriebene Verhalten ist interessant, da beide Versionen von numpy stammen. Einer ist eineufunc
, der andere ist einenumpy.lib
Funktion. Warum scipy die Bibliotheksfunktion der vorziehtufunc
, weiß ich nicht genau.EDIT: In der Tat kann ich die
log10
Frage beantworten . Wenn__init__
ich in die Scipy- Methode schaue , sehe ich Folgendes :Die
log10
Funktion, die Sie in scipy erhalten, kommt vonnumpy.lib.scimath
. Wenn man sich diesen Code ansieht, heißt es:Es scheint , dass Modul - Overlays die Basis numpy ufuncs für
sqrt
,log
,log2
,logn
,log10
,power
,arccos
,arcsin
, undarctanh
. Das erklärt das Verhalten, das Sie sehen. Der zugrunde liegende Designgrund, warum es so gemacht wird, ist wahrscheinlich irgendwo in einem Mailinglistenbeitrag vergraben.quelle
Aus dem SciPy-Referenzhandbuch:
Benutzer sollen die Unterscheidung zwischen
scipy
undnumpy
Namespaces nicht kennen müssen, obwohl Sie anscheinend eine Ausnahme gefunden haben.quelle
Aus den SciPy-FAQ geht hervor, dass einige Funktionen von NumPy aus historischen Gründen hier sind, während sie nur in SciPy verfügbar sein sollten:
Das erklärt, warum
scipy.linalg.solve
einige zusätzliche Funktionen angeboten werdennumpy.linalg.solve
.Ich habe die Antwort von SethMMorton auf die entsprechende Frage nicht gesehen
quelle
Am Ende der Einführung in die SciPy- Dokumentation befindet sich ein kurzer Kommentar :
Ich denke, dies wird es jemandem mit ausreichendem Wissen über alle beteiligten Pakete ermöglichen, genau herauszufinden , was die Unterschiede zwischen einigen Scipy- und Numpy-Funktionen sind (es hat mir bei der log10-Frage überhaupt nicht geholfen). Ich habe dieses Wissen definitiv nicht, zeige es aber
source
anscipy.linalg.solve
undnumpy.linalg.solve
interagiere auf unterschiedliche Weise mit Lapack.Dies ist auch mein erster Beitrag. Wenn ich hier etwas ändern sollte, lass es mich wissen.
quelle
Aus Wikipedia ( http://en.wikipedia.org/wiki/NumPy#History ):
scipy
hängt vonnumpy
vielennumpy
Funktionen ab und importiert sie zur Vereinfachung in seinen Namespace.quelle
In Bezug auf das Linalg-Paket rufen die Scipy-Funktionen Lapack und Blas auf, die in hochoptimierten Versionen auf vielen Plattformen verfügbar sind und eine sehr gute Leistung bieten, insbesondere für Operationen mit relativ großen, dichten Matrizen. Andererseits sind sie nicht einfach zu kompilieren, da ein fortran-Compiler und viele plattformspezifische Optimierungen erforderlich sind, um die volle Leistung zu erzielen. Daher bietet numpy einfache Implementierungen vieler gängiger linearer Algebra-Funktionen, die für viele Zwecke oft gut genug sind.
quelle
dual
: "Dieses Modul sollte für Funktionen sowohl in numpy als auch in scipy verwendet werden, wenn Sie die numpy-Version verwenden möchten, falls verfügbar, aber ansonsten die scipy-Version." Verwendung ---from numpy.dual import fft, inv
Aus Vorlesungen über ' Quantitative Economics '
SciPy ist ein Paket, das verschiedene Tools enthält, die auf NumPy aufbauen und den Array-Datentyp und die zugehörigen Funktionen verwenden
Tatsächlich erhalten wir beim Importieren von SciPy auch NumPy, wie aus der SciPy-Initialisierungsdatei hervorgeht
Es ist jedoch üblicher und besser, die NumPy-Funktionalität explizit zu verwenden
Was in SciPy nützlich ist, ist die Funktionalität in seinen Unterpaketen
quelle
Neben dem SciPy FAQ die Duplizierung beschreibt , ist in erster Linie für die Abwärtskompatibilität ist es weiter in der geklärten NumPy Dokumentation zu sagen , dass
Der Kürze halber sind dies:
Auch aus dem SciPy-Tutorial :
Für neue Anwendungen sollten Sie daher die NumPy-Version der Array-Operationen bevorzugen, die in der obersten Ebene von SciPy dupliziert werden. Für die oben aufgeführten Domänen sollten Sie die in SciPy bevorzugten Domänen bevorzugen und gegebenenfalls die Abwärtskompatibilität in NumPy überprüfen.
Nach meiner persönlichen Erfahrung befinden sich die meisten von mir verwendeten Array-Funktionen in der obersten Ebene von NumPy (mit Ausnahme von
random
). Alle domänenspezifischen Routinen sind jedoch in Unterpaketen von SciPy vorhanden, sodass ich selten etwas von der obersten Ebene von SciPy verwende.quelle