2013-03-20 17 views
9

Uwaga: sprawdziłem pod kątem duplikatu i nic wyraźnie nie odpowie na moje pytanie. Ufam, że dasz mi znać, jeśli coś przeoczyłem!Wytyczne importu SciPy/NumPy

W celu oczyszczenia mojego kodu, szukałem standardowej konwencji do importowania SciPy i NumPy w moich programach. Wiem, że nie ma ścisłej wytycznej i mogę zrobić to tak, jak chcę, ale od czasu do czasu wciąż znajduję sprzeczne instrukcje.

Na przykład, czytałem gdzieś, że NumPy ma za zadanie tylko implementować obiekt tablicy, podczas gdy SciPy jest dostępny dla wszystkich innych algorytmów naukowych. Tak więc NumPy powinno być używane do obsługi tablic i SciPy do wszystkiego innego ... Z drugiej strony, SciPy importuje wszystkie funkcje Numpy w głównej przestrzeni nazw, tak, że scipy.array() to to samo, co numpy.array() (see this question), więc NumPy powinno być tylko używane gdy SciPy nie jest używany, ponieważ są duplikaty ...

Jaki jest zalecany sposób pracy z SciPy i NumPy? Będąc naukowcem, sqrt(-1) powinien zwracać liczbę zespoloną, więc jestem skłonny iść tylko z SciPy.

Teraz mój kod zaczyna się od:

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

używam scipy dla operacji matematycznej (np log10()) i numpy do tworzenia tablicy/operacji (takich jak np.zeros()). Czy byłoby dobrze przejść całą drogę z SciPy i nigdy nie importować NumPy jawnie? Czy przyszła aktualizacja usunie manipulację tablicą NumPy z SciPy?

+3

Polecam pobrać te warianty funkcji bezpośrednio z 'numpy.lib.scimath', gdzie są one zdefiniowane, zamiast z scipy. –

Odpowiedz

5

Zalecam zrobienie czegoś podobnego

import numpy as np 
import scipy as sp 

zamiast. Zawsze jest niebezpieczne wykonywanie from ... import *, szczególnie w przypadku dużych modułów, takich jak numpy i scipy. Poniższe ilustruje, dlaczego:

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

Co się tutaj dzieje? Standardowa funkcja wbudowana Pythona any została zastąpiona przez scipy.any, która ma inne zachowanie. To może złamać dowolny kod korzystający ze standardu any.

+0

Dostaję niebezpieczeństwo "z ... importu", ale importowanie scipy i numpy jest zbędne, ponieważ numpy jest zawarty w scipy, a scipy jest lepszy dla komputerów naukowych. – PhilMacKay

+0

Następnie po prostu zaimportuj 'scipy', ale nie rób' od scipy import * '. – user763305

+0

Zdecydowałem się na twoją odpowiedź, ponieważ nie ma już nic więcej do dodania. W moim przypadku, ponieważ cały czas pracowałem naukowo, przetestowałem używając 'import scipy as sp' i użyłem' sp.stuff' do wszystkiego. W bardziej ogólnym środowisku komputerowym, gdzie scipy nie jest potrzebna, przypuszczam, że numpy byłaby drogą do zrobienia. Nie mogę wymyślić sytuacji, w której obydwoje będą potrzebni w tym samym czasie. – PhilMacKay

0

Co na temat tworzenia klas i używać tylko to, co trzeba, fx: klasa pierwsza:

import cv2 
from SIGBWindows import SIGBWindows 
from SIGBAssg import * 

klasa druga:

import cv2 
import numpy as np 

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

klasa trzecia:

import cv2 
import numpy as np 

i Wreszcie, gdy nazywamy obiekt:

import cv2 
from SIGBWindows import SIGBWindows 
from SIGBAssg import * 

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

Nie wiem, czy to jest to, czego szukasz, ale to podejście sprawia, że ​​kod jest naprawdę czysty i łatwo dodać do niego więcej funkcji.

+0

umm, na jakie pytanie odpowiadasz? – MattDMo

+0

Hmmm ... To nie jest to, czego szukam. Moim głównym celem byłoby utrzymanie kodu jako łatwego do przeczytania i prostego, jak to tylko możliwe, ponieważ chcę, aby ktoś inny (lub ja w ciągu roku) mógł łatwo zrozumieć mój algorytm. – PhilMacKay

+0

Tak, podążam za wami, ale ponieważ do przetwarzania obrazów potrzebna jest oboczna tablica, myślę, że zrobienie tego w ten sposób jest najprostszym sposobem na uczynienie kodu łatwiejszym do odczytania. – jycr753

1

Ten post zawiera dobre informacje na temat dwóch modułów (Relationship between scipy and numpy). Wygląda na to, że funkcja Numpy ma być całkowicie zawarta w Scipy, chociaż istnieje kilka wyjątków (patrz post).Powiedziałbym, że można bezpiecznie używać Scipy do wszystkich swoich potrzeb, ponieważ najważniejsze funkcje, takie jak funkcje matematyczne, tablice i inne rzeczy są zawarte w Scipy.