2013-03-20 10 views
9

Hinweis: Ich habe nach Duplikaten gesucht und nichts beantwortet meine Frage eindeutig. Ich hoffe, du wirst mich wissen lassen, wenn ich etwas verpasst habe!SciPy/NumPy Importrichtlinie

In dem Bemühen, meinen Code aufzuräumen, habe ich nach einer Standardkonvention für den Import von SciPy und NumPy in meinen Programmen gesucht. Ich weiß, dass es keine strenge Richtlinie gibt und ich kann es so machen, wie ich es möchte, aber von Zeit zu Zeit finde ich immer noch widersprüchliche Anweisungen.

Zum Beispiel habe ich irgendwo gelesen, dass NumPy nur das Array-Objekt implementieren soll, während SciPy für alle anderen wissenschaftlichen Algorithmen da ist. Also NumPy sollte für Array-Betrieb und SciPy für alles andere verwendet werden ... Auf der anderen Seite importiert SciPy jede Numpy-Funktionen in seinem Hauptnamespace, so dass scipy.array() ist das gleiche wie numpy.array() (see this question), so NumPy sollte nur sein Wird verwendet, wenn SciPy nicht verwendet wird, da es sich um Duplikate handelt ...

Wie wird empfohlen, mit SciPy und NumPy zu arbeiten? Ein Wissenschaftler, sqrt(-1) sollte eine komplexe Zahl zurückgeben, also bin ich geneigt, nur mit SciPy zu gehen.

Gerade jetzt beginnt mein Code mit:

import numpy as np 
from scipy import * 
from matplotlib import pyplot as plt 

I scipy für mathematische Operation (wie log10()) und numpy für Array-Erstellung/Operationen (wie np.zeros()) verwenden. Wäre es in Ordnung, den ganzen Weg mit SciPy zu gehen und niemals NumPy explizit zu importieren? Wird ein zukünftiges Update die Array-Manipulation von NumPy von SciPy entfernen?

+3

Ich würde empfehlen, diese Varianten der Funktionen direkt von 'numpy.lib.scimath' zu erhalten, wo sie definiert sind, anstatt von scipy. –

Antwort

5

Ich empfehle, so etwas wie

import numpy as np 
import scipy as sp 

statt. Es ist immer gefährlich, from ... import * vor allem mit großen Modulen wie numpy und scipy zu tun. Das Folgende zeigt warum:

>>> any(['foo']) 
True 
>>> from scipy import * 
>>> any(['foo']) 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    any(['foo']) 
    File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 1575, in any 
    return _wrapit(a, 'any', axis, out) 
    File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 37, in _wrapit 
    result = getattr(asarray(obj),method)(*args, **kwds) 
TypeError: cannot perform reduce with flexible type 

Was passiert hier? Die Standard-Python-Built-in-Funktion any wird durch scipy.any ersetzt, die ein unterschiedliches Verhalten aufweist. Das könnte Code brechen, der den Standard any verwendet.

+0

Ich bekomme die Gefahr von "von ... Import *", aber der Import von Scipy und Numpy ist überflüssig, da numpy in scipy enthalten ist und scipy besser für wissenschaftliches Rechnen ist. – PhilMacKay

+0

Dann importieren Sie einfach "scipy", aber nicht "scipy import *". – user763305

+0

Ich habe mich für Ihre Antwort entschieden, da es so gut wie nichts hinzuzufügen gibt. In meinem Fall, da ich die ganze Zeit wissenschaftliche Berechnungen mache, teste ich nur "import scipy as sp" und verwende "sp.stuff" für alles. In einer allgemeineren Computerumgebung, in der scipy nicht benötigt wird, nehme ich an, dass numpy der richtige Weg wäre. Ich kann mir keine Situation vorstellen, in der beides gleichzeitig nötig wäre. – PhilMacKay

0

Was Klassen machen und verwenden Sie nur, was Sie benötigen, fx: Klasse ein:

import cv2 
from SIGBWindows import SIGBWindows 
from SIGBAssg import * 

Klasse zwei:

import cv2 
import numpy as np 

from pylab import * 
from scipy.cluster.vq import * 
from scipy.misc import imresize 

Klasse drei:

import cv2 
import numpy as np 

und Schließlich, wo wir das Objekt nennen:

import cv2 
from SIGBWindows import SIGBWindows 
from SIGBAssg import * 

windows = SIGBWindows(mode="video") 
windows.openVideo("somevideo.avi") 
kmeans(windows) 

Ich weiß nicht, ob es das ist, was Sie suchen, aber dieser Ansatz macht den Code wirklich sauber und einfach, um weitere Funktionen hinzuzufügen.

+0

Ähm, welche Frage beantworten Sie? – MattDMo

+0

Hmmm ... Das ist nicht ganz das, wonach ich suche. Mein Hauptziel wäre es, den Code so einfach und verständlich wie möglich zu halten, da ich möchte, dass jemand anders (oder ich selbst in einem Jahr) meinen Algorithmus leicht verstehen kann. – PhilMacKay

+0

Ja, ich folge dir dabei, aber da beide Arten von Arrays für die Bildverarbeitung benötigt werden, denke ich, dass es der einfachste Weg ist, den Code leichter lesbar zu machen. – jycr753

1

Dieser Beitrag enthält einige gute Informationen zu den beiden Modulen (Relationship between scipy and numpy). Es scheint, dass Numpys Funktionalität vollständig in Scipy enthalten sein soll, obwohl es einige Ausnahmen gibt (siehe Beitrag).Ich würde sagen, es ist sicher, Scipy einfach für all Ihre Bedürfnisse zu verwenden, da die wichtigsten Dinge wie mathematische Funktionen, Arrays und andere Dinge in Scipy enthalten sind.