SciPy v Python Výukový program: Co je to, knihovna, funkce a příklady
SciPy v Python
SciPy v Python je open-source knihovna používaná pro řešení matematických, vědeckých, inženýrských a technických problémů. Umožňuje uživatelům manipulovat s daty a vizualizovat je pomocí široké škály vysoké úrovně Python příkazy. SciPy je postaveno na Python NumPy rozšíření. SciPy se také vyslovuje jako „Sigh Pi“.
Dílčí balíčky SciPy:
- Vstup/výstup souboru – scipy.io
- Speciální funkce - scipy.speciální
- Lineární algebra Operation – scipy.linalg
- Interpolace – scipy.interpolovat
- Optimalizace a přizpůsobení – scipy.optimalizovat
- Statistiky a náhodná čísla – scipy.stats
- Numerická integrace – scipy.integrovat
- Rychlé Fourierovy transformace – scipy.fftpack
- Signal Zpracování – scipy.signál
- Manipulace s obrázky - scipy.ndobraz
Proč používat SciPy
- SciPy obsahuje různé dílčí balíčky, které pomáhají vyřešit nejběžnější problém související s vědeckými výpočty.
- SciPy balíček v Python je nejpoužívanější vědecká knihovna hned na druhém místě po GNU Scientific Library pro C/C++ nebo Matlab.
- Snadné použití a pochopení, stejně jako rychlý výpočetní výkon.
- Může pracovat na poli knihovny NumPy.
Numpy VS SciPy
nemotorný
- Numpy je napsán v C a používá se pro matematické nebo numerické výpočty.
- Je rychlejší než ostatní Python knihovny
- Numpy je nejužitečnější knihovna pro Data Science pro provádění základních výpočtů.
- Numpy neobsahuje nic jiného než datový typ pole, který provádí nejzákladnější operace, jako je třídění, tvarování, indexování atd.
SciPy
- SciPy je zabudován v horní části NumPy
- Modul SciPy Python je plně funkční verze lineární algebry, zatímco Numpy obsahuje pouze několik funkcí.
- Většina nových funkcí Data Science je k dispozici spíše ve Scipy než v Numpy.
SciPy – Instalace a nastavení prostředí
Můžete také nainstalovat SciPy Windows přes pip
Python3 -m pip install --user numpy scipy
Nainstalujte Scipy na Linux
sudo apt-get install python-scipy python-numpy
Nainstalujte SciPy na Mac
sudo port install py35-scipy py35-numpy
Než se začneme učit SciPy Python, potřebujete znát základní funkcionalitu i různé typy pole nemotorný
Standardní způsob importu modulů SciPy a Numpy:
from scipy import special #same for other modules import numpy as np
Balíček pro vstup/výstup souboru
Scipy, I/O balíček, má širokou škálu funkcí pro práci s různými formáty souborů, kterými jsou Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV a binární formát.
Vezměme si jeden formát souboru Python Příklad SciPy, který se pravidelně používá v MatLab:
import numpy as np from scipy import io as sio array = np.ones((4, 4)) sio.savemat('example.mat', {'ar': array}) data = sio.loadmat(‘example.mat', struct_as_record=True) data['ar']
Výstup:
array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])
Vysvětlení kódu
- Řádek 1 a 2: Importujte základní knihovnu SciPy Python s I/O balíčkem a Numpy.
- linka 3: Vytvořte 4 x 4 rozměrné pole
- linka 4: Uložit pole do příklad.mat soubor.
- Řádek 5: Získejte data z příklad.mat soubor
- linka 6: Tiskový výstup.
Speciální balíček funkcí
- scipy.speciální balíček obsahuje četné funkce matematické fyziky.
- Speciální funkce SciPy zahrnuje kubickou odmocninu, exponenciální, logaritmický součet exponenciál, Lambert, permutace a kombinace, gama, Bessel, hypergeometrické, Kelvin, beta, parabolický válec, relativní exponenciální chyba atd.
- Pro jednořádkový popis všech těchto funkcí zadejte Python řídicí panel:
help(scipy.special) Output: NAME scipy.special DESCRIPTION ======================================== Special functions (:mod:`scipy.special`) ======================================== .. module:: scipy.special Nearly all of the functions below are universal functions and follow broadcasting and automatic array-looping rules. Exceptions are noted.
Funkce kubické odmocniny
Funkce Kubická odmocnina najde odmocninu hodnot.
Syntaxe:
scipy.special.cbrt(x)
Příklad:
from scipy.special import cbrt #Find cubic root of 27 & 64 using cbrt() function cb = cbrt([27, 64]) #print value of cb print(cb)
Výstup: pole([3., 4.])
Exponenciální funkce:
Exponenciální funkce počítá 10**x po prvcích.
Příklad:
from scipy.special import exp10 #define exp10 function and pass value in its exp = exp10([1,10]) print(exp)
Výstup: [1.e+01 1.e+10]
Permutace a kombinace
SciPy také poskytuje funkce pro výpočet permutací a kombinací.
Kombinace - scipy.special.comb(N,k)
Příklad:
from scipy.special import comb #find combinations of 5, 2 values using comb(N, k) com = comb(5, 2, exact = False, repetition=True) print(com)
Výstup: 15.0
Permutace –
scipy.special.perm(N,k)
Příklad:
from scipy.special import perm #find permutation of 5, 2 using perm (N, k) function per = perm(5, 2, exact = True) print(per)
Výstup: 20
Log Sum Exponenciální funkce
Log součet exponenciální počítá logaritmus součtového exponenciálního vstupního prvku.
Syntaxe:
scipy.special.logsumexp(x)
Besselova funkce
Funkce výpočtu n-tého celého čísla
Syntaxe:
scipy.special.jn()
Lineární algebra se SciPy
- Lineární algebra SciPy je implementací knihoven BLAS a ATLAS LAPACK.
- Výkon lineární algebry je ve srovnání s BLAS a LAPACK velmi rychlý.
- Rutina lineární algebry přijímá objekt dvourozměrného pole a výstupem je také dvourozměrné pole.
Nyní uděláme nějaký test scipy.linalg,
Výpočet determinant dvourozměrné matice,
from scipy import linalg import numpy as np #define square matrix two_d_array = np.array([ [4,5], [3,2] ]) #pass values to det() function linalg.det( two_d_array )
Výstup: -7.0
Inverzní matice –
scipy.linalg.inv()
Inverse Matrix of Scipy vypočítá inverzní hodnotu jakékoli čtvercové matice.
Uvidíme,
from scipy import linalg import numpy as np # define square matrix two_d_array = np.array([ [4,5], [3,2] ]) #pass value to function inv() linalg.inv( two_d_array )
Výstup:
array( [[-0.28571429, 0.71428571], [ 0.42857143, -0.57142857]] )
Vlastní čísla a vlastní vektor
scipy.linalg.eig()
- Nejběžnějším problémem v lineární algebře jsou vlastní čísla a vlastní vektory, které lze snadno vyřešit pomocí eig()funkce.
- Nyní najdeme vlastní hodnotu (X) a odpovídají vlastnímu vektoru dvourozměrné čtvercové matice.
Příklad
from scipy import linalg import numpy as np #define two dimensional array arr = np.array([[5,4],[6,3]]) #pass value into function eg_val, eg_vect = linalg.eig(arr) #get eigenvalues print(eg_val) #get eigenvectors print(eg_vect)
Výstup:
[ 9.+0.j -1.+0.j] #eigenvalues [ [ 0.70710678 -0.5547002 ] #eigenvectors [ 0.70710678 0.83205029] ]
Diskrétní Fourierova transformace – scipy.fftpack
- DFT je matematická technika, která se používá při převodu prostorových dat na frekvenční data.
- FFT (Fast Fourier Transformation) je algoritmus pro výpočet DFT
- FFT se aplikuje na vícerozměrné pole.
- Frekvence definuje počet signálu nebo vlnovou délku v určitém časovém období.
Příklad: Zamávejte a ukažte se pomocí knihovny Matplotlib. vezmeme jednoduchý příklad periodické funkce sin(20 × 2πt)
%matplotlib inline from matplotlib import pyplot as plt import numpy as np #Frequency in terms of Hertz fre = 5 #Sample rate fre_samp = 50 t = np.linspace(0, 2, 2 * fre_samp, endpoint = False ) a = np.sin(fre * 2 * np.pi * t) figure, axis = plt.subplots() axis.plot(t, a) axis.set_xlabel ('Time (s)') axis.set_ylabel ('Signal amplitude') plt.show()
Výstup:
Můžete to vidět. Frekvence je 5 Hz a její signál se opakuje za 1/5 sekundy – je to volání jako konkrétní časový úsek.
Nyní použijme tuto sinusoidu pomocí aplikace DFT.
from scipy import fftpack A = fftpack.fft(a) frequency = fftpack.fftfreq(len(a)) * fre_samp figure, axis = plt.subplots() axis.stem(frequency, np.abs(A)) axis.set_xlabel('Frequency in Hz') axis.set_ylabel('Frequency Spectrum Magnitude') axis.set_xlim(-fre_samp / 2, fre_samp/ 2) axis.set_ylim(-5, 110) plt.show()
Výstup:
- Jasně vidíte, že výstup je jednorozměrné pole.
- Vstup obsahující komplexní hodnoty je nula kromě dvou bodů.
- V příkladu DFT vizualizujeme velikost signálu.
Optimalizace a přizpůsobení ve SciPy – scipy.optimize
- Optimalizace poskytuje užitečný algoritmus pro minimalizaci prokládání křivek, vícerozměrné nebo skalární a kořenové přizpůsobení.
- Vezměme si příklad skalární funkce,najít minimální skalární funkci.
%matplotlib inline import matplotlib.pyplot as plt from scipy import optimize import numpy as np def function(a): return a*2 + 20 * np.sin(a) plt.plot(a, function(a)) plt.show() #use BFGS algorithm for optimization optimize.fmin_bfgs(function, 0)
Výstup:
Optimalizace byla úspěšně ukončena.
Aktuální hodnota funkce: -23.241676
Počet opakování: 4
Hodnocení funkcí: 18
Gradientní hodnocení: 6
pole([-1.67096375])
- V tomto příkladu je optimalizace provedena pomocí gradientového sestupného algoritmu z počátečního bodu
- Možným problémem jsou ale lokální minima místo globálních minim. Pokud nenajdeme souseda globálních minim, musíme použít globální optimalizaci a najít funkci globálního minima použitou jako basinhopping() který kombinuje lokální optimalizátor.
optimalizovat.basinhopping(funkce, 0)
Výstup:
fun: -23.241676238045315 lowest_optimization_result: fun: -23.241676238045315 hess_inv: array([[0.05023331]]) jac: array([4.76837158e-07]) message: 'Optimization terminated successfully.' nfev: 15 nit: 3 njev: 5 status: 0 success: True x: array([-1.67096375]) message: ['requested number of basinhopping iterations completed successfully'] minimization_failures: 0 nfev: 1530 nit: 100 njev: 510 x: array([-1.67096375])
Algoritmus Nelder – Mead:
- Algoritmus Nelder-Mead vybírá prostřednictvím parametru metody.
- Poskytuje nejpřímější způsob minimalizace pro slušnou funkci.
- Algoritmus Nelder – Mead se pro vyhodnocení gradientu nepoužívá, protože nalezení řešení může trvat déle.
import numpy as np from scipy.optimize import minimize #define function f(x) def f(x): return .4*(1 - x[0])**2 optimize.minimize(f, [2, -1], method="Nelder-Mead")
Výstup:
final_simplex: (array([[ 1. , -1.27109375], [ 1. , -1.27118835], [ 1. , -1.27113762]]), array([0., 0., 0.])) fun: 0.0 message: 'Optimization terminated successfully.' nfev: 147 nit: 69 status: 0 success: True x: array([ 1. , -1.27109375])
Zpracování obrazu pomocí SciPy – scipy.ndimage
- scipy.ndimage je podmodul SciPy, který se většinou používá k provádění operací souvisejících s obrázky
- ndimage znamená „n“ rozměrný obrázek.
- SciPy Image Processing poskytuje geometrickou transformaci (otočení, oříznutí, převrácení), filtrování obrazu (ostré a zmenšení nosu), zobrazení obrazu, segmentaci obrazu, klasifikaci a extrakci funkcí.
- MISC balíček ve SciPy obsahuje předpřipravené obrázky, které lze použít k provedení úlohy manipulace s obrázky
Příklad: Vezměme si příklad geometrické transformace obrázků
from scipy import misc from matplotlib import pyplot as plt import numpy as np #get face image of panda from misc package panda = misc.face() #plot or show image of face plt.imshow( panda ) plt.show()
Výstup:
Teď my Překlopení dolů aktuální obrázek:
#Flip Down using scipy misc.face image flip_down = np.flipud(misc.face()) plt.imshow(flip_down) plt.show()
Výstup:
Příklad: Otočení obrázku pomocí Scipy,
from scipy import ndimage, misc from matplotlib import pyplot as plt panda = misc.face() #rotatation function of scipy for image – image rotated 135 degree panda_rotate = ndimage.rotate(panda, 135) plt.imshow(panda_rotate) plt.show()
Výstup:
Integrace se Scipy – Numerická integrace
- Když integrujeme jakoukoli funkci, kde analytická integrace není možná, musíme se obrátit na numerickou integraci
- SciPy poskytuje funkce pro integraci funkcí s numerickou integrací.
- scipy.integrovat knihovna má jednoduchá integrace, dvojitá, trojitá, vícenásobná, Gaussova čtvercová, Rombergova, lichoběžníková a Simpsonova pravidla.
Příklad: Nyní si vezměte příklad Jednotná integrace
Zde a je horní hranice a b je spodní hranice
from scipy import integrate # take f(x) function as f f = lambda x : x**2 #single integration with a = 0 & b = 1 integration = integrate.quad(f, 0 , 1) print(integration)
Výstup:
(0.33333333333333337, 3.700743415417189e-15)
Zde funkce vrací dvě hodnoty, z nichž první hodnota je integrace a druhá hodnota je odhadovaná chyba v integrálu.
Příklad: Nyní si vezměte příklad SciPy dvojitá integrace. Najdeme dvojitou integraci následující rovnice,
from scipy import integrate import numpy as np #import square root function from math lib from math import sqrt # set fuction f(x) f = lambda x, y : 64 *x*y # lower limit of second integral p = lambda x : 0 # upper limit of first integral q = lambda y : sqrt(1 - 2*y**2) # perform double integration integration = integrate.dblquad(f , 0 , 2/4, p, q) print(integration)
Výstup:
(3.0, 9.657432734515774e-14)
Viděli jste, že výše uvedený výstup jako stejný předchozí.
Shrnutí
- SciPy (vyslovováno jako „Sigh Pi“) je otevřený zdroj Python-založená knihovna, která se používá v matematice, vědeckých počítačích, inženýrství a technických počítačích.
- SciPy obsahuje různé dílčí balíčky, které pomáhají vyřešit nejběžnější problém související s vědeckými výpočty.
- SciPy je zabudován v horní části NumPy
Package Name | Description |
---|---|
scipy.io | Vstup/výstup souboru |
scipy.speciální | Speciální funkce |
scipy.linalg | Lineární algebra Operavání |
scipy.interpolovat | Interpolace |
scipy.optimalizovat | Optimalizace a přizpůsobení |
scipy.stats | Statistiky a náhodná čísla |
scipy.integrovat | Numerická integrace |
scipy.fftpack | Rychlé Fourierovy transformace |
scipy.signál | Signal Zpracování |
scipy.ndobraz | Manipulace s obrázky - |