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:

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:

Diskrétní Fourierova transformace

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:

Diskrétní Fourierova transformace

  • 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 a přizpůsobení ve SciPy

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:

Zpracování obrazu pomocí SciPy

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:

Zpracování obrazu pomocí SciPy

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:

Zpracování obrazu pomocí SciPy

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

Integrace se Scipy

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,

Integrace se Scipy

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 -