SciPy unutra Python Vodič: Što je, biblioteka, funkcija i primjeri

SciPy unutra Python

SciPy unutra Python je knjižnica otvorenog koda koja se koristi za rješavanje matematičkih, znanstvenih, inženjerskih i tehničkih problema. Omogućuje korisnicima manipuliranje podacima i vizualizaciju podataka pomoću širokog raspona visoke razine Python naredbe. SciPy je izgrađen na Python NumPy ekstenzija. SciPy se također izgovara kao "Sigh Pi".

Potpaketi SciPy:

Zašto koristiti SciPy

  • SciPy sadrži različite potpakete koji pomažu u rješavanju najčešćih problema povezanih sa znanstvenim računanjem.
  • SciPy paket u Python je najčešće korištena znanstvena knjižnica, odmah iza GNU-ove znanstvene knjižnice za C/C++ ili Matlab-a.
  • Jednostavan za korištenje i razumijevanje, kao i brza računalna snaga.
  • Može raditi na nizu NumPy biblioteke.

Numpy VS SciPy

numpy

  • Numpy je napisan u C-u i koristi se za matematičke ili numeričke izračune.
  • Brži je od ostalih Python Knjižnice
  • Numpy je najkorisnija biblioteka za Data Science za izvođenje osnovnih izračuna.
  • Numpy ne sadrži ništa osim vrste podataka polja koja izvodi najosnovnije operacije poput sortiranja, oblikovanja, indeksiranja itd.

SciPy

  • SciPy je ugrađen u NumPy
  • SciPy modul u Python je potpuno opremljena verzija Linearne algebre dok Numpy sadrži samo nekoliko značajki.
  • Većina novih značajki Data Science dostupna je u Scipyju, a ne u Numpyju.

SciPy – Instalacija i postavljanje okruženja

Također možete instalirati SciPy u Windows putem pipa

Python3 -m pip install --user numpy scipy 

Instalirajte Scipy na Linux

sudo apt-get install  python-scipy python-numpy

Instalirajte SciPy na Mac

sudo port install py35-scipy py35-numpy

Prije nego počnemo učiti SciPy Python, trebate poznavati osnovne funkcije kao i različite vrste niza numpy

Standardni način uvoza SciPy modula i Numpyja:

from scipy import special   #same for other modules
import numpy as np

Paket za ulaz/izlaz datoteke

Scipy, I/O paket, ima širok raspon funkcija za rad s različitim formatima datoteka kao što su Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV i binarni format.

Uzmimo jedan format datoteke Python SciPy primjer koji se redovito koristi u MatLabu:

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

Izlaz:

array([[ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.]])

Objašnjenje koda

  • Redak 1 i 2: Uvezite osnovnu biblioteku SciPy Python s I/O paketom i Numpyjem.
  • linija 3: Stvorite 4 x 4, dimenzionalni niz
  • linija 4: Pohrani niz u primjer.mat file.
  • Redak 5: Dobiti podatke od primjer.mat file
  • linija 6: Ispis.

Paket posebnih funkcija

  • scipy.poseban paket sadrži brojne funkcije matematičke fizike.
  • Posebna funkcija SciPy uključuje kubični korijen, eksponencijal, eksponencijal log zbroja, Lambert, permutaciju i kombinacije, gama, Bessel, hipergeometriju, Kelvin, beta, parabolički cilindar, eksponencijal relativne pogreške itd.
  • Za opis svih ovih funkcija u jednom retku upišite Python konzola:
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.

Funkcija kubičnog korijena

Funkcija kubičnog korijena pronalazi kubni korijen vrijednosti.

Sintaksa:

scipy.special.cbrt(x)

Primjer:

from scipy.special import cbrt
#Find cubic root of 27 & 64 using cbrt() function
cb = cbrt([27, 64])
#print value of cb
print(cb)

Izlaz: niz([3., 4.])

Eksponencijalna funkcija:

Eksponencijalna funkcija izračunava 10**x po elementima.

Primjer:

from scipy.special import exp10
#define exp10 function and pass value in its
exp = exp10([1,10])
print(exp)

Izlaz: [1.e+01 1.e+10]

Permutacije i kombinacije

SciPy također daje funkcionalnost za izračunavanje permutacija i kombinacija.

Kombinacije - scipy.poseban.comb(N,k)

Primjer:

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)

Izlaz: 15.0

Permutacije –

scipy.special.perm(N,k)

Primjer:

from scipy.special import perm
#find permutation of 5, 2 using perm (N, k) function
per = perm(5, 2, exact = True)
print(per)

Izlaz: 20

Log zbroj eksponencijalne funkcije

Log Sum Exponential izračunava log zbroja eksponencijalnog ulaznog elementa.

sintaksa:

scipy.special.logsumexp(x) 

Besselova funkcija

Funkcija izračuna n-tog cijelog reda

sintaksa:

scipy.special.jn()

Linearna algebra sa SciPy

  • Linearna algebra SciPy je implementacija BLAS i ATLAS LAPACK biblioteka.
  • Izvedba Linearne algebre vrlo je brza u usporedbi s BLAS-om i LAPACK-om.
  • Rutina linearne algebre prihvaća objekt dvodimenzionalnog niza i izlaz je također dvodimenzionalni niz.

Sada napravimo neki test sa scipy.linalg,

računanje determinanta dvodimenzionalne matrice,

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 )

Izlaz: -7.0

Inverzna matrica –

scipy.linalg.inv()

Inverzna matrica Scipyja izračunava inverziju bilo koje kvadratne matrice.

Da vidimo,

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 )

Izlaz:

array( [[-0.28571429,  0.71428571],
       [ 0.42857143, -0.57142857]] )

Svojstvene vrijednosti i svojstveni vektor

scipy.linalg.eig()

  • Najčešći problem u linearnoj algebri su svojstvene vrijednosti i svojstveni vektor koji se lako mogu riješiti pomoću eig()funkcija.
  • Sada ćemo pronaći vlastitu vrijednost (X) i odgovaraju svojstvenom vektoru dvodimenzionalne kvadratne matrice.

Primjer

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)

Izlaz:

[ 9.+0.j -1.+0.j] #eigenvalues
 [ [ 0.70710678 -0.5547002 ] #eigenvectors
   [ 0.70710678  0.83205029] ]

Diskretna Fourierova transformacija – scipy.fftpack

  • DFT je matematička tehnika koja se koristi za pretvaranje prostornih podataka u frekvencijske podatke.
  • FFT (Fast Fourier Transformation) je algoritam za izračunavanje DFT-a
  • FFT se primjenjuje na višedimenzionalni niz.
  • Frekvencija definira broj signala ili valne duljine u određenom vremenskom razdoblju.

Primjer: Zamahnite i pokažite pomoću biblioteke Matplotlib. uzmimo primjer jednostavne periodične funkcije 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()

Izlaz:

Diskretna Fourierova transformacija

Možete vidjeti ovo. Frekvencija je 5 Hz i njegov signal se ponavlja u 1/5 sekunde – to je poziv kao određeni vremenski period.

Iskoristimo sada ovaj sinusoidni val uz pomoć DFT aplikacije.

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

Izlaz:

Diskretna Fourierova transformacija

  • Možete jasno vidjeti da je izlaz jednodimenzionalni niz.
  • Ulaz koji sadrži složene vrijednosti je nula osim dvije točke.
  • U DFT primjeru vizualiziramo veličinu signala.

Optimizacija i uklapanje u SciPy – scipy.optimize

  • Optimizacija pruža koristan algoritam za minimiziranje prilagođavanja krivulje, višedimenzionalnog ili skalarnog i korijenskog prilagođavanja.
  • Uzmimo primjer skalarna funkcija,pronaći minimalnu skalarnu funkciju.
%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) 

Izlaz:

Optimizacija i uklapanje u SciPy

Optimizacija je uspješno prekinuta.

Trenutna vrijednost funkcije: -23.241676

Ponavljanja: 4

Ocjene funkcija: 18

Ocjene stupnjeva: 6

niz([-1.67096375])

  • U ovom primjeru optimizacija se vrši uz pomoć algoritma gradijentnog spuštanja od početne točke
  • Ali mogući problem su lokalni minimumi umjesto globalnih minimuma. Ako ne pronađemo susjeda globalnih minimuma, tada moramo primijeniti globalnu optimizaciju i pronaći globalnu funkciju minimuma koja se koristi kao skakanje u bazen () koji kombinira lokalni optimizator.

optimize.basinhopping(funkcija, 0)

Izlaz:

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

Nelder – Mead algoritam:

  • Nelder-Mead algoritam bira kroz parametar metode.
  • Omogućuje najjednostavniji način minimiziranja za pošteno funkcioniranje.
  • Nelder – Mead algoritam se ne koristi za procjene gradijenta jer može biti potrebno više vremena da se pronađe rješenje.
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")

Izlaz:

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

Obrada slike sa SciPy – scipy.ndimage

  • scipy.ndimage je podmodul SciPy-ja koji se uglavnom koristi za izvođenje operacije povezane sa slikom
  • ndimage znači "n" dimenzionalnu sliku.
  • SciPy Image Processing omogućuje transformaciju geometrije (rotiranje, obrezivanje, okretanje), filtriranje slike (oštro i dezinfekciju), prikaz slike, segmentaciju slike, klasifikaciju i ekstrakciju značajki.
  • RAZNO paket u SciPy sadrži unaprijed izgrađene slike koje se mogu koristiti za izvođenje zadatka manipulacije slikama

Primjer: Uzmimo primjer geometrijske transformacije slika

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

Izlaz:

Obrada slike sa SciPy

Sad mi Preklopni trenutna slika:

#Flip Down using scipy misc.face image  
flip_down = np.flipud(misc.face())
plt.imshow(flip_down)
plt.show()

Izlaz:

Obrada slike sa SciPy

Primjer: Rotacija slike pomoću Scipyja,

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

Izlaz:

Obrada slike sa SciPy

Integracija sa Scipyjem – Numerička integracija

  • Kada integriramo bilo koju funkciju gdje analitička integracija nije moguća, moramo se okrenuti numeričkoj integraciji
  • SciPy pruža funkcionalnost za integraciju funkcije s numeričkom integracijom.
  • scipy.integrirati biblioteka ima jednostruku integraciju, dvostruku, trostruku, višestruku, Gaussov kvadrat, Rombergova, trapezna i Simpsonova pravila.

Primjer: Sada uzmite primjer Jedinstvena integracija

Integracija sa Scipyjem

Ovdje a je gornja granica i b je donja granica

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)

Izlaz:

(0.33333333333333337, 3.700743415417189e-15)

Ovdje funkcija vraća dvije vrijednosti, od kojih je prva vrijednost integracija, a druga vrijednost procijenjena pogreška u integralu.

Primjer: sada uzmite SciPy primjer dvostruka integracija. Nalazimo dvostruku integraciju sljedeće jednadžbe,

Integracija sa Scipyjem

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)

Izlaz:

(3.0, 9.657432734515774e-14)

Vidjeli ste da je gornji izlaz kao isti prethodni.

Rezime

  • SciPy (izgovara se kao "Sigh Pi") je otvoreni izvor Pythonknjižnica koja se koristi u matematici, znanstvenom računarstvu, inženjerstvu i tehničkom računarstvu.
  • SciPy sadrži različite potpakete koji pomažu u rješavanju najčešćih problema povezanih sa znanstvenim računanjem.
  • SciPy je ugrađen u NumPy
Naziv paketa Description
scipy.io Ulaz/izlaz datoteke
scipy.poseban Posebna funkcija
scipy.linalg Linearna algebra OperaANJE
scipy.interpolirati Interpolacija
scipy.optimizirati Optimizacija i prilagodba
scipy.statistika Statistika i slučajni brojevi
scipy.integrirati Numerička integracija
scipy.fftpack Brze Fourierove transformacije
scipy.signal Signal Obrada
scipy.ndimage Manipulacija slikama –