Tutorial SciPy: Ce este SciPy? (cu exemple)
โก Rezumat inteligent
SciPy este open-source Python Bibliotecฤ pentru calcul ศtiinศific ศi tehnic, construitฤ pe baza NumPy. Aici veศi รฎnvฤศa principalele subpachete pentru I/O fiศiere, algebrฤ liniarฤ, optimizare, transformฤri Fourier, integrare ศi procesare de imagini, cu exemple.

SciPy รฎn Python
SciPy รฎn Python este o bibliotecฤ open-source folositฤ pentru rezolvarea problemelor matematice, ศtiinศifice, de inginerie ศi tehnice. Permite utilizatorilor sฤ manipuleze datele ศi sฤ le vizualizeze folosind o gamฤ largฤ de instrumente de nivel รฎnalt Python comenzi. SciPy este construit pe Python Extensia NumPy. SciPy este, de asemenea, pronunศat ca โSigh Piโ.
Sub-pachete de SciPy:
- Intrare/ieศire fiศier โ scipy.io
- Funcศie specialฤ - scipy.special
- Algebrฤ liniarฤ Operaศie โ scipy.linalg
- interpolare - scipy.interpolare
- Optimizare ศi potrivire - scipy.optimize
- Statistici ศi numere aleatoare - scipy.stats
- Integrare numericฤ - scipy.integra
- Transformate Fourier rapide - scipy.fftpack
- Signal Prelucrare โ scipy.semnal
- Manipularea imaginii - scipy.ndimage
De ce sฤ folosiศi SciPy
- SciPy conศine varietฤศi de subpachete care ajutฤ la rezolvarea celei mai frecvente probleme legate de calculul ศtiinศific.
- Pachetul SciPy รฎn Python este cea mai folositฤ bibliotecฤ ศtiinศificฤ, a doua dupฤ GNU Scientific Library pentru C/C++ sau de la Matlab.
- Uศor de utilizat ศi de รฎnศeles, precum ศi putere de calcul rapidฤ.
- Poate funcศiona pe o serie de biblioteci NumPy.
Numpy VS SciPy
NumPy
- Numpy este scris รฎn C ศi este utilizat pentru calcule matematice sau numerice.
- Este mai rapid decรขt altele Python Biblioteci
- Numpy este cea mai utilฤ bibliotecฤ pentru Data Science pentru a efectua calcule de bazฤ.
- Numpy nu conศine nimic altceva decรขt date de tip array care efectueazฤ cele mai elementare operaศii, cum ar fi sortarea, sha-ul.ping, indexare etc.
SciPy
- SciPy este construit รฎn partea de sus a NumPy
- Modulul SciPy รฎn Python este o versiune completฤ a Algebrei liniare, รฎn timp ce Numpy conศine doar cรขteva caracteristici.
- Majoritatea noilor funcศii Data Science sunt disponibile รฎn Scipy ศi nu รฎn Numpy.
SciPy โ Instalare ศi configurare a mediului
De asemenea, puteศi instala SciPy รฎn Windows prin pip
Python3 -m pip install --user numpy scipy
Instalaศi Scipy pe Linux
sudo apt-get install python-scipy python-numpy
Instalaศi SciPy pe Mac
sudo port install py35-scipy py35-numpy
รnainte de a รฎncepe sฤ รฎnvฤศฤm SciPy Python, trebuie sฤ cunoaศteศi funcศionalitatea de bazฤ, precum ศi diferite tipuri de matrice de NumPy
Modul standard de a importa module SciPy ศi Numpy:
from scipy import special #same for other modules import numpy as np
Pachetul de intrare/ieศire fiศier
Scipy, pachet I/O, are o gamฤ largฤ de funcศii pentru lucrul cu diferite formate de fiศiere, care sunt Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV ศi format binar.
Sฤ luฤm un singur format de fiศier Python Exemplu SciPy care sunt utilizate รฎn mod regulat รฎn 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']
ieศire:
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
Code Explicaศie
- Linia 1 ศi 2: Importaศi biblioteca esenศialฤ SciPy รฎn Python cu pachet I/O ศi Numpy.
- Line 3: Creaศi o matrice dimensionalฤ 4 x 4
- Line 4: stocaศi matricea รฎn exemplu.mat fiศier.
- Linia 5: Obศineศi date de la exemplu.mat fiลier
- Line 6: Ieศire tipฤritฤ.
Pachet cu funcศii speciale
- scipy.special pachetul conศine numeroase funcศii ale fizicii matematice.
- Funcศia specialฤ SciPy include rฤdฤcinฤ cubicฤ, exponenศialฤ, log sumฤ exponenศialฤ, Lambert, permutare ศi combinaศii, Gamma, Bessel, hipergeometricฤ, Kelvin, beta, cilindru parabolic, eroare relativฤ exponenศialฤ etc.
- Pentru descrierea pe o linie a tuturor acestor funcศii, tastaศi Python consolฤ:
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.
Funcศia rฤdฤcinฤ cubicฤ
Funcศia Cubic Root gฤseศte rฤdฤcina cubฤ a valorilor.
Sintaxฤ:
scipy.special.cbrt(x)
Exemplu:
from scipy.special import cbrt #Find cubic root of 27 & 64 using cbrt() function cb = cbrt([27, 64]) #print value of cb print(cb)
ieศire: matrice([3., 4.])
Functie exponentiala:
Funcศia exponenศialฤ calculeazฤ elementul 10**x.
Exemplu:
from scipy.special import exp10 #define exp10 function and pass value in its exp = exp10([1,10]) print(exp)
ieศire: [1.e+01 1.e+10]
Permutฤri ศi combinaศii
SciPy oferฤ, de asemenea, funcศionalitate pentru a calcula Permutฤrile ศi Combinaศiile.
combinatii - scipy.special.comb(N,k)
Exemplu:
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)
ieศire: 15.0
Permutฤri -
scipy.special.perm(N,k)
Exemplu:
from scipy.special import perm #find permutation of 5, 2 using perm (N, k) function per = perm(5, 2, exact = True) print(per)
ieศire: 20
Funcศia exponenศialฤ a sumei jurnalului
Log Sum Exponential calculeazฤ logul elementului de intrare sumฤ exponenศialฤ.
Sintaxa:
scipy.special.logsumexp(x)
Funcศia Bessel
Funcศia de calcul de ordinul a n-a รฎntreg
Sintaxa:
scipy.special.jn()
Algebrฤ liniarฤ cu SciPy
- Linear Algebra of SciPy este o implementare a bibliotecilor BLAS ศi ATLAS LAPACK.
- Performanศa Algebrei Liniare este foarte rapidฤ รฎn comparaศie cu BLAS ศi LAPACK.
- Rutina de algebrฤ liniarฤ acceptฤ obiecte matrice bidimensionale ศi ieศirea este, de asemenea, o matrice bidimensionalฤ.
Acum hai sฤ facem un test cu scipy.linalg,
De calculat determinant a unei matrice bidimensionale,
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 )
ieศire: -7.0
matrice inversฤ -
scipy.linalg.inv()
Inverse Matrix of Scipy calculeazฤ inversul oricฤrei matrice pฤtrate.
Sฤ vedem,
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 )
ieศire:
array( [[-0.28571429, 0.71428571],
[ 0.42857143, -0.57142857]] )
Valori proprii ศi vector propriu
scipy.linalg.eig()
- Cea mai comunฤ problemฤ รฎn algebra liniarฤ este valorile proprii ศi vectorul propriu care pot fi rezolvate cu uศurinศฤ folosind eig()Funcศia.
- Acum sฤ gฤsim valoarea proprie a (X) ศi vectorul propriu corespunzฤtor al unei matrice pฤtrate bidimensionale.
Exemplu
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)
ieศire:
[ 9.+0.j -1.+0.j] #eigenvalues [ [ 0.70710678 -0.5547002 ] #eigenvectors [ 0.70710678 0.83205029] ]
Transformatฤ Fourier discretฤ โ scipy.fftpack
- DFT este o tehnicฤ matematicฤ care este utilizatฤ pentru conversia datelor spaศiale รฎn date de frecvenศฤ.
- FFT (Fast Fourier Transformation) este un algoritm pentru calculul DFT
- FFT se aplicฤ unei matrice multidimensionale.
- Frecvenศa defineศte numฤrul de semnal sau lungimea de undฤ รฎntr-o anumitฤ perioadฤ de timp.
Exemplu: Ia un val ศi aratฤ folosind biblioteca Matplotlib. luฤm exemplu de funcศie periodicฤ simplฤ a 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()
ieศire:
Puteศi vedea asta. Frecvenศa este de 5 Hz ศi semnalul sฤu se repetฤ รฎn 1/5 secunde - este apelul ca o anumitฤ perioadฤ de timp.
Acum sฤ folosim aceastฤ undฤ sinusoidฤ cu ajutorul aplicaศiei 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()
ieศire:
- Puteศi vedea clar cฤ rezultatul este o matrice unidimensionalฤ.
- Intrฤrile care conศin valori complexe sunt zero, cu excepศia a douฤ puncte.
- รn exemplul DFT vizualizฤm mฤrimea semnalului.
Optimizare ศi potrivire รฎn SciPy โ scipy.optimize
- Optimizarea oferฤ un algoritm util pentru minimizarea potrivirii curbei, multidimensionale sau scalare ศi a rฤdฤcinii.
- Sฤ luฤm un exemplu de o funcศie scalarฤ,pentru a gฤsi funcศia scalarฤ minimฤ.
%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)
ieศire:
Optimizarea s-a รฎncheiat cu succes.
Valoarea curentฤ a funcศiei: -23.241676
Iteraศii: 4
Evaluฤri ale funcศiei: 18
Evaluฤri gradient: 6
matrice([-1.67096375])
- รn acest exemplu, optimizarea se face cu ajutorul algoritmului de coborรขre a gradientului din punctul iniศial
- Dar posibila problemฤ este minimele locale รฎn loc de minimele globale. Dacฤ nu gฤsim un vecin al minimelor globale, atunci trebuie sฤ aplicฤm optimizarea globalฤ ศi sฤ gฤsim funcศia de minime globale utilizatฤ ca bazinhopping() care combinฤ optimizatorul local.
optimize.basinhopping(funcศie, 0)
ieศire:
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])
Algoritmul Nelder โ Mead:
- Algoritmul Nelder-Mead selecteazฤ prin parametrul metodei.
- Oferฤ cea mai simplฤ modalitate de minimizare pentru funcศia corectฤ.
- Algoritmul Nelder โ Mead nu este utilizat pentru evaluฤrile gradientului, deoarece poate dura mai mult timp pentru a gฤsi soluศia.
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")
ieศire:
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])
Procesarea imaginii cu SciPy โ scipy.ndimage
- scipy.ndimage este un submodul al SciPy care este folosit รฎn principal pentru a efectua o operaศie legatฤ de imagine
- ndimage รฎnseamnฤ imaginea โnโ dimensionalฤ.
- SciPy Image Processing oferฤ transformฤri geometrice (rotire, decupare, rฤsturnare), filtrare a imaginilor (clarificare ศi eliminare a denivelฤrii), afiศare a imaginilor, segmentare a imaginilor, clasificare ศi funcศii similare.tracTION.
- Pachetul MISC รฎn SciPy conศine imagini prefabricate care pot fi utilizate pentru a efectua sarcina de manipulare a imaginii
Exemplu: Sฤ luฤm un exemplu de transformare geometricฤ a imaginilor
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()
ieศire:
Acum noi Flip-down imagine curenta:
#Flip Down using scipy misc.face image
flip_down = np.flipud(misc.face())
plt.imshow(flip_down)
plt.show()
ieศire:
Exemplu: Rotirea imaginii folosind 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()
ieศire:
Integrare cu Scipy โ Integrare numericฤ
- Cรขnd integrฤm orice funcศie รฎn care integrarea analiticฤ nu este posibilฤ, trebuie sฤ apelฤm la integrarea numericฤ
- SciPy oferฤ funcศionalitate pentru integrarea funcศiei cu integrarea numericฤ.
- scipy.integra biblioteca are integrare simplฤ, dublฤ, triplฤ, multiplฤ, pฤtratฤ Gaussian, Romberg, Trapezoidal ศi regulile lui Simpson.
Exemplu: Acum luaศi un exemplu de Integrare unicฤ
Aici a este limita superioarฤ ศi b este limita inferioarฤ
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)
ieศire:
(0.33333333333333337, 3.700743415417189e-15)
Aici funcศia returneazฤ douฤ valori, รฎn care prima valoare este integrarea ศi a doua valoare este eroarea estimatฤ รฎn integralฤ.
Exemplu: Acum luaศi un exemplu SciPy dubla integrare. Gฤsim dubla integrare a urmฤtoarei ecuaศii,
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)
ieศire:
(3.0, 9.657432734515774e-14)
Aศi vฤzut acea ieศire de mai sus ca aceeaศi versiune anterioarฤ.








