Wydaje się, że SciPy zapewnia większość (ale nie wszystkie [1]) funkcji NumPy we własnej przestrzeni nazw. Innymi słowy, jeśli istnieje funkcja o nazwie numpy.foo
, prawie na pewno istnieje scipy.foo
. Przez większość czasu oba wydają się być dokładnie takie same, często nawet wskazują na ten sam obiekt funkcyjny.
Czasami są inni. Aby podać przykład, który pojawił się niedawno:
numpy.log10
jest ufunc, który zwraca NaN dla negatywnych argumentów;scipy.log10
zwraca złożone wartości dla argumentów ujemnych i nie wydaje się być ufunc.
To samo można powiedzieć o log
, log2
a logn
, ale nie o log1p
[2].
Z drugiej strony numpy.exp
i scipy.exp
wydają się być różnymi nazwami dla tego samego ufunc. Dotyczy to również scipy.log1p
i numpy.log1p
.
Innym przykładem jest numpy.linalg.solve
vs scipy.linalg.solve
. Są podobne, ale ta ostatnia oferuje kilka dodatkowych funkcji w stosunku do pierwszej.
Dlaczego pozorne powielanie? Jeśli ma to być hurtowy import numpy
do scipy
przestrzeni nazw, dlaczego subtelne różnice w zachowaniu i brakujące funkcje? Czy istnieje jakaś nadrzędna logika, która pomogłaby usunąć zamieszanie?
[1] numpy.min
, numpy.max
, numpy.abs
i kilka innych nie mają odpowiedników w scipy
przestrzeni nazw.
[2] Testowane przy użyciu NumPy 1.5.1 i SciPy 0.9.0rc2.
all of those functions are available without additionally importing Numpy
ponieważthe intention is for users not to have to know the distinction between the scipy and numpy namespaces
. Teraz się zastanawiam, bo śledzę posty o numpy i trochę chropowaty i sam go używam. I prawie zawsze widzę, że numpy jest importowane osobno (jako np.). Więc zawiedli?Odpowiedzi:
Ostatnim razem, gdy to sprawdziłem,
__init__
metoda scipy wykonuje adzięki czemu cała przestrzeń nazw numpy jest dołączana do scipy podczas importowania modułu scipy.
log10
Zachowanie opisujesz jest interesujący, ponieważ obydwie wersje pochodzą z numpy. Jedna toufunc
druga, a druga tonumpy.lib
funkcja. Dlaczego scipy woli bibliotekę od tejufunc
, nie wiem od samego początku.EDYCJA: W rzeczywistości mogę odpowiedzieć na
log10
pytanie. Patrząc na__init__
metodę scipy , widzę to:log10
Funkcja pojawi się w scipy pochodzinumpy.lib.scimath
. Patrząc na ten kod, mówi:Wydaje się, że nakładki Moduł ufuncs baza NumPy na
sqrt
,log
,log2
,logn
,log10
,power
,arccos
,arcsin
, iarctanh
. To wyjaśnia zachowanie, które widzisz. Podstawowy powód, dla którego tak się to robi, jest prawdopodobnie ukryty gdzieś na liście mailingowej.źródło
Z SciPy Reference Guide:
Chodzi o to, aby użytkownicy nie musieli znać rozróżnienia między przestrzeniami nazw
scipy
inumpy
, chociaż najwyraźniej znalazłeś wyjątek.źródło
Z SciPy FAQ wynika, że niektóre funkcje NumPy są tutaj ze względów historycznych, podczas gdy powinno być tylko w SciPy:
To wyjaśnia, dlaczego
scipy.linalg.solve
oferuje kilka dodatkowych funkcjinumpy.linalg.solve
.Nie widziałem odpowiedzi SethMMorton na powiązane pytanie
źródło
Na końcu wprowadzenia do dokumentacji SciPy znajduje się krótki komentarz :
Myślę, że pozwoli to komuś z wystarczającą wiedzą na temat wszystkich zaangażowanych pakietów dokładnie rozróżnić różnice między niektórymi funkcjami scipy i numpy (nie pomogło mi to w przypadku pytania log10). Zdecydowanie nie mam tej wiedzy, ale
source
to wskazujescipy.linalg.solve
inumpy.linalg.solve
na różne sposoby wchodzę w interakcję z lapackiem;To także mój pierwszy post, więc jeśli coś tu zmienię, daj mi znać.
źródło
Z Wikipedii ( http://en.wikipedia.org/wiki/NumPy#History ):
scipy
zależynumpy
i importuje wielenumpy
funkcji do przestrzeni nazw dla wygody.źródło
Jeśli chodzi o pakiet linalg - funkcje scipy będą wywoływać lapack i blas, które są dostępne w wysoce zoptymalizowanych wersjach na wielu platformach i oferują bardzo dobrą wydajność, szczególnie w przypadku operacji na stosunkowo dużych gęstych matrycach. Z drugiej strony nie są łatwymi bibliotekami do kompilacji, wymagającymi kompilatora fortran i wielu poprawek specyficznych dla platformy, aby uzyskać pełną wydajność. Dlatego numpy zapewnia proste implementacje wielu typowych funkcji algebry liniowej, które często są wystarczające do wielu celów.
źródło
dual
: „Ten moduł powinien być używany do funkcji zarówno w numpy, jak i scipy, jeśli chcesz używać wersji numpy, jeśli jest dostępna, ale w przeciwnym razie wersja scipy”. Zastosowanie ---from numpy.dual import fft, inv
Od Wykłady na „ Quantitative Ekonomicznej ”
SciPy to pakiet zawierający różne narzędzia zbudowane na NumPy, wykorzystujące jego typ danych tablicowych i powiązaną funkcjonalność
W rzeczywistości, gdy importujemy SciPy, otrzymujemy również NumPy, jak widać z pliku inicjującego SciPy
Jednak bardziej powszechną i lepszą praktyką jest jawne korzystanie z funkcji NumPy
W SciPy przydatna jest funkcjonalność jej podpakietów
źródło
Oprócz SciPy FAQ opisującego powielanie dotyczy głównie wstecznej kompatybilności, wyjaśniono w dokumentacji NumPy, aby powiedzieć, że
Dla zwięzłości są to:
Ponadto z samouczka SciPy :
Tak więc, w przypadku nowych aplikacji, powinieneś preferować wersję NumPy operacji tablicowych, które są duplikowane na najwyższym poziomie SciPy. W przypadku domen wymienionych powyżej powinieneś preferować domeny w SciPy i sprawdzić wsteczną zgodność, jeśli to konieczne w NumPy.
Z mojego osobistego doświadczenia wynika, że większość funkcji tablicy, z których korzystam, istnieje na najwyższym poziomie NumPy (oprócz
random
). Jednak wszystkie procedury specyficzne dla domeny istnieją w podpakcjach SciPy, więc rzadko używam czegokolwiek z najwyższego poziomu SciPy.źródło