SciPy in Python Handledning: Vad är, bibliotek, funktion och exempel

SciPy in Python

SciPy in Python är ett bibliotek med öppen källkod som används för att lösa matematiska, vetenskapliga, tekniska och tekniska problem. Det tillåter användare att manipulera data och visualisera data med ett brett utbud av högnivåer Python kommandon. SciPy bygger på Python NumPy-förlängning. SciPy uttalas också som "Sigh Pi."

Underpaket av SciPy:

Varför använda SciPy

  • SciPy innehåller olika underpaket som hjälper till att lösa det vanligaste problemet relaterat till Scientific Computation.
  • SciPy paket in Python är det mest använda vetenskapliga biblioteket bara näst efter GNU Scientific Library för C/C++ eller Matlabs.
  • Lätt att använda och förstå samt snabb beräkningskraft.
  • Det kan fungera på en mängd NumPy-bibliotek.

Numpy VS SciPy

numpy

  • Numpy skrivs i C och används för matematiska eller numeriska beräkningar.
  • Det är snabbare än andra Python bibliotek
  • Numpy är det mest användbara biblioteket för Data Science för att utföra grundläggande beräkningar.
  • Numpy innehåller inget annat än arraydatatyp som utför den mest grundläggande operationen som sortering, formning, indexering, etc.

SciPy

  • SciPy är byggt i toppen av NumPy
  • SciPy-modul in Python är en fullfjädrad version av linjär algebra medan Numpy bara innehåller ett fåtal funktioner.
  • De flesta nya Data Science-funktioner är tillgängliga i Scipy snarare än Numpy.

SciPy – Installation och miljöinställningar

Du kan också installera SciPy i Windows via pip

Python3 -m pip install --user numpy scipy 

Installera Scipy på Linux

sudo apt-get install  python-scipy python-numpy

Installera SciPy i Mac

sudo port install py35-scipy py35-numpy

Innan vi börjar lära oss SciPy Python, måste du känna till grundläggande funktionalitet såväl som olika typer av en array av numpy

Standardsättet att importera SciPy-moduler och Numpy:

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

File Input / Output-paket

Scipy, I/O-paket, har ett brett utbud av funktioner för arbete med olika filformat som är Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV och binärt format.

Låt oss ta ett filformat Python SciPy-exempel som regelbundet används i 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']

Produktion:

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

Kodförklaring

  • Rad 1 och 2: Importera det viktiga SciPy-biblioteket till Python med I/O-paket och Numpy.
  • Linje 3: Skapa 4 x 4, dimensionell ens array
  • Linje 4: Lagra array i exempel.mat fil.
  • Linje 5: Få data från exempel.mat fil
  • Linje 6: Utskrift.

Specialfunktionspaket

  • scipy.special paketet innehåller många funktioner i matematisk fysik.
  • SciPy specialfunktion inkluderar Cubic Root, Exponential, Log Sum Exponential, Lambert, Permutation and Combinations, Gamma, Bessel, hypergeometric, Kelvin, beta, parabolic cylinder, Relative Error Exponential, etc.
  • För en beskrivning av alla dessa funktioner, skriv in Python trösta:
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.

Cubic Root Funktion

Cubic Root-funktionen hittar kubikroten av värden.

Syntax:

scipy.special.cbrt(x)

Exempelvis:

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

Produktion: array([3., 4.])

Exponentiell funktion:

Exponentiell funktion beräknar 10**x elementvis.

Exempelvis:

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

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

Permutationer och kombinationer

SciPy ger också funktionalitet för att beräkna permutationer och kombinationer.

Kombinationer – scipy.special.comb(N,k)

Exempelvis:

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)

Produktion: 15.0

Permutationer –

scipy.special.perm(N,k)

Exempelvis:

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

Produktion: 20

Log Sum Exponential Funktion

Log Sum Exponential beräknar loggen för summa exponentiellt indataelement.

Syntax:

scipy.special.logsumexp(x) 

Bessel funktion

N:te heltalsordningens beräkningsfunktion

Syntax:

scipy.special.jn()

Linjär algebra med SciPy

  • Linear Algebra of SciPy är en implementering av BLAS- och ATLAS LAPACK-bibliotek.
  • Prestandan för linjär algebra är mycket snabb jämfört med BLAS och LAPACK.
  • Linjär algebra-rutin accepterar tvådimensionella arrayobjekt och utdata är också en tvådimensionell array.

Nu ska vi göra ett test med scipy.linalg,

beräkning determinant av en tvådimensionell matris,

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 )

Produktion: -7.0

Invers matris –

scipy.linalg.inv()

Invers Matrix of Scipy beräknar inversen av en kvadratisk matris.

Låt oss se,

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 )

Produktion:

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

Egenvärden och egenvektor

scipy.linalg.eig()

  • Det vanligaste problemet inom linjär algebra är egenvärden och egenvektor som enkelt kan lösas med hjälp av eig()funktion.
  • Låt oss nu hitta egenvärdet för (X) och motsvarande egenvektor för en tvådimensionell kvadratisk matris.

Exempelvis

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)

Produktion:

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

Diskret Fourier Transform – scipy.fftpack

  • DFT är en matematisk teknik som används för att omvandla rumslig data till frekvensdata.
  • FFT (Fast Fourier Transformation) är en algoritm för beräkning av DFT
  • FFT appliceras på en flerdimensionell array.
  • Frekvens definierar antalet signaler eller våglängder i en viss tidsperiod.

Exempelvis: Ta en våg och visa med Matplotlib-biblioteket. vi tar enkla periodiska funktioner exempel på 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()

Produktion:

Diskret Fourier Transform

Du kan se detta. Frekvensen är 5 Hz och dess signal upprepas på 1/5 sekund – det är anrop som en viss tidsperiod.

Låt oss nu använda denna sinusvåg med hjälp av DFT-applikationen.

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

Produktion:

Diskret Fourier Transform

  • Du kan tydligt se att utdata är en endimensionell array.
  • Indata som innehåller komplexa värden är noll utom två punkter.
  • I DFT-exemplet visualiserar vi signalens storlek.

Optimering och passning i SciPy – scipy.optimize

  • Optimering ger en användbar algoritm för minimering av kurvanpassning, flerdimensionell eller skalär och rotanpassning.
  • Låt oss ta ett exempel på en skalär funktion,för att hitta minsta skalär funktion.
%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) 

Produktion:

Optimering och passning i SciPy

Optimeringen avslutades framgångsrikt.

Nuvarande funktionsvärde: -23.241676

Iterationer: 4

Funktionsutvärderingar: 18

Gradientutvärderingar: 6

array([-1.67096375])

  • I det här exemplet görs optimering med hjälp av gradient descent-algoritmen från startpunkten
  • Men den möjliga frågan är lokala minima istället för globala minima. Om vi ​​inte hittar en granne till globala minima, måste vi tillämpa global optimering och hitta global minimafunktion som används som basinhopping() som kombinerar lokal optimerare.

optimize.basinhopping(funktion, 0)

Produktion:

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 Algoritm:

  • Nelder-Mead-algoritmen väljer genom metodparameter.
  • Det ger det enklaste sättet att minimera för en rättvis funktion.
  • Nelder – Mead-algoritm används inte för gradientutvärderingar eftersom det kan ta längre tid att hitta lösningen.
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")

Produktion:

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

Bildbehandling med SciPy – scipy.ndimage

  • scipy.ndimage är en undermodul till SciPy som mest används för att utföra en bildrelaterad operation
  • ndimage betyder den "n"-dimensionella bilden.
  • SciPy Image Processing tillhandahåller geometriska transformationer (rotera, beskära, vända), bildfiltrering (skarp och de nosing), visningsbild, bildsegmentering, klassificering och extraktion av funktioner.
  • MISC-paket i SciPy innehåller förbyggda bilder som kan användas för att utföra bildmanipuleringsuppgifter

Exempelvis: Låt oss ta ett exempel på geometrisk transformation av bilder

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

Produktion:

Bildbehandling med SciPy

Nu vi Flip-down aktuell bild:

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

Produktion:

Bildbehandling med SciPy

Exempelvis: Rotation av bild med 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()

Produktion:

Bildbehandling med SciPy

Integration med Scipy – Numerisk integration

  • När vi integrerar någon funktion där analytisk integrering inte är möjlig måste vi vända oss till numerisk integration
  • SciPy tillhandahåller funktionalitet för att integrera funktion med numerisk integration.
  • scipy.integrera biblioteket har enkel integration, dubbel, trippel, multipel, Gaussisk kvadrat, Romberg, Trapets och Simpsons regler.

Exempelvis: Ta nu ett exempel på Enkel integration

Integration med Scipy

Här a är den övre gränsen och b är den nedre gränsen

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)

Produktion:

(0.33333333333333337, 3.700743415417189e-15)

Funktionen här returnerar två värden, där det första värdet är integration och det andra värdet är uppskattat fel i integralen.

Exempel: Ta nu ett SciPy-exempel på dubbel integration. Vi finner den dubbla integrationen av följande ekvation,

Integration med 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)

Produktion:

(3.0, 9.657432734515774e-14)

Du har sett ovanstående utdata som samma föregående.

Sammanfattning

  • SciPy (uttalas som "Sigh Pi") är en öppen källkod Python-baserat bibliotek, som används i matematik, vetenskaplig beräkning, teknik och teknisk beräkning.
  • SciPy innehåller olika underpaket som hjälper till att lösa det vanligaste problemet relaterat till Scientific Computation.
  • SciPy är byggt i toppen av NumPy
Paket Namn Systembeskrivningar
scipy.io Filinmatning/utmatning
scipy.special Särskild funktion
scipy.linalg Linjär algebra Operation
scipy.interpolera Interpole
scipy.optimize Optimering och passform
scipy.stats Statistik och slumptal
scipy.integrera Numerisk integration
scipy.fftpack Snabb Fourier-transformation
scipy.signal Signal Bearbetning
scipy.ndimage Bildmanipulation –