SciPy in Python Tutorial: Was ist, Bibliothek, Funktion & Beispiele

SciPy in Python

SciPy in Python ist eine Open-Source-Bibliothek zur Lรถsung mathematischer, wissenschaftlicher, technischer und technischer Probleme. Sie ermรถglicht es Benutzern, die Daten zu manipulieren und mithilfe einer breiten Palette hochrangiger Python Befehle. SciPy basiert auf dem Python NumPy-Erweiterung. SciPy wird auch als โ€žSigh Piโ€œ ausgesprochen.

Unterpakete von SciPy:

Warum SciPy verwenden?

  • SciPy enthรคlt verschiedene Unterpakete, die bei der Lรถsung der hรคufigsten Probleme im Zusammenhang mit wissenschaftlichen Berechnungen helfen.
  • SciPy-Paket in Python ist die am hรคufigsten verwendete Scientific-Bibliothek, gleich nach der GNU Scientific Library fรผr C/C++ oder Matlabs.
  • Einfach zu bedienen und zu verstehen sowie schnelle Rechenleistung.
  • Es kann auf einem Array der NumPy-Bibliothek ausgefรผhrt werden.

Numpy VS SciPy

Numpy

  • Numpy ist in C geschrieben und wird fรผr mathematische oder numerische Berechnungen verwendet.
  • Es ist schneller als andere Python Bibliotheken
  • Numpy ist die nรผtzlichste Bibliothek fรผr Data Science, um grundlegende Berechnungen durchzufรผhren.
  • Numpy enthรคlt nichts anderes als den Array-Datentyp, der die grundlegendsten Operationen wie Sortieren, Formgeben, Indizieren usw. ausfรผhrt.

SciPy

  • SciPy ist in NumPy integriert
  • SciPy-Modul in Python ist eine voll funktionsfรคhige Version der linearen Algebra, wรคhrend Numpy nur wenige Funktionen enthรคlt.
  • Die meisten neuen Data Science-Funktionen sind in Scipy und nicht in Numpy verfรผgbar.

SciPy โ€“ Installation und Umgebungseinrichtung

Sie kรถnnen SciPy auch in installieren Windows รผber pip

Python3 -m pip install --user numpy scipy 

Installieren Sie Scipy unter Linux

sudo apt-get install  python-scipy python-numpy

Installieren Sie SciPy auf dem Mac

sudo port install py35-scipy py35-numpy

Bevor wir anfangen, SciPy zu lernen Python, mรผssen Sie die grundlegende Funktionalitรคt sowie verschiedene Arten von Arrays kennen NumPy

Die Standardmethode zum Importieren von SciPy-Modulen und Numpy:

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

Datei-Eingabe-/Ausgabepaket

Scipy, das I/O-Paket, verfรผgt รผber eine breite Palette von Funktionen fรผr die Arbeit mit verschiedenen Dateiformaten, darunter Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV und Binรคrformat.

Nehmen wir ein Dateiformat Python SciPy-Beispiele, die regelmรครŸig in MatLab verwendet werden:

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

Ausgang:

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

Code Erklรคrung

  • Zeile 1 & 2: Importieren Sie die grundlegende SciPy-Bibliothek in Python mit I/O-Paket und Numpy.
  • Linie 3: Erstellen Sie ein 4 x 4-dimensionales Einsen-Array
  • Linie 4: Array speichern in example.mat Datei.
  • Linie 5: Holen Sie sich Daten von example.mat Datei
  • Linie 6: Druckausgabe.

Sonderfunktionspaket

  • scipy.special Paket enthรคlt zahlreiche Funktionen der mathematischen Physik.
  • Zu den SciPy-Sonderfunktionen gehรถren Kubikwurzel, Exponential, Logsummen-Exponential, Lambert, Permutation und Kombinationen, Gamma, Bessel, Hypergeometrie, Kelvin, Beta, Parabolzylinder, Relativer-Fehler-Exponential usw.
  • Fรผr eine einzeilige Beschreibung aller dieser Funktionen geben Sie ein Python Konsole:
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.

Kubische Wurzelfunktion

Die Kubikwurzelfunktion ermittelt die Kubikwurzel von Werten.

Syntax:

scipy.special.cbrt(x)

Ejemplo:

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

Ausgang: Array([3., 4.])

Exponentialfunktion:

Die Exponentialfunktion berechnet 10**x elementweise.

Ejemplo:

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

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

Permutationen und Kombinationen

SciPy bietet auch Funktionen zur Berechnung von Permutationen und Kombinationen.

Kombinationen - scipy.special.comb(N,k)

Ejemplo:

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)

Ausgang: 15.0

Permutationen โ€“

scipy.special.perm(N,k)

Ejemplo:

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

Ausgang: 20

Log-Summe-Exponentialfunktion

Log Sum Exponential berechnet den Logarithmus des Summenexponential-Eingabeelements.

Syntax:

scipy.special.logsumexp(x) 

Bessel-Funktion

N-te Berechnungsfunktion ganzzahliger Ordnung

Syntax:

scipy.special.jn()

Lineare Algebra mit SciPy

  • Die lineare Algebra von SciPy ist eine Implementierung der BLAS- und ATLAS LAPACK-Bibliotheken.
  • Die Leistung der linearen Algebra ist im Vergleich zu BLAS und LAPACK sehr schnell.
  • Die lineare Algebra-Routine akzeptiert zweidimensionale Array-Objekte und gibt auch ein zweidimensionales Array aus.

Jetzt machen wir einen Test mit scipy.linalg,

Berechnung bestimmend einer zweidimensionalen Matrix,

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 )

Ausgang: -7.0

Inverse Matrix โ€“

scipy.linalg.inv()

Inverse Matrix von Scipy berechnet die Umkehrung jeder quadratischen Matrix.

Mal sehen,

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 )

Ausgang:

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

Eigenwerte und Eigenvektor

scipy.linalg.eig()

  • Das hรคufigste Problem in der linearen Algebra sind Eigenwerte und Eigenvektoren, die mit leicht gelรถst werden kรถnnen eig()Funktion.
  • Lassen Sie uns nun den Eigenwert von (X) und entsprechen dem Eigenvektor einer zweidimensionalen quadratischen Matrix.

Beispiel

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)

Ausgang:

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

Diskrete Fourier-Transformation โ€“ scipy.fftpack

  • DFT ist eine mathematische Technik, die zur Umwandlung rรคumlicher Daten in Frequenzdaten verwendet wird.
  • FFT (Fast Fourier Transformation) ist ein Algorithmus zur Berechnung der DFT
  • FFT wird auf ein mehrdimensionales Array angewendet.
  • Die Frequenz definiert die Anzahl der Signale oder Wellenlรคngen in einem bestimmten Zeitraum.

Ejemplo: Machen Sie eine Welle und zeigen Sie mit der Matplotlib-Bibliothek. Wir nehmen ein einfaches periodisches Funktionsbeispiel von 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()

Ausgang:

diskrete Fourier-Transformation

Das kann man sehen. Die Frequenz betrรคgt 5 Hz und das Signal wiederholt sich in 1/5 Sekunde โ€“ es handelt sich dabei um einen bestimmten Zeitraum.

Lassen Sie uns nun diese Sinuswelle mithilfe der DFT-Anwendung verwenden.

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

Ausgang:

diskrete Fourier-Transformation

  • Sie kรถnnen deutlich erkennen, dass die Ausgabe ein eindimensionales Array ist.
  • Eingaben, die komplexe Werte enthalten, sind mit Ausnahme von zwei Punkten Null.
  • Im DFT-Beispiel visualisieren wir die GrรถรŸe des Signals.

Optimierung und Anpassung in SciPy โ€“ scipy.optimize

  • Die Optimierung bietet einen nรผtzlichen Algorithmus zur Minimierung der Kurvenanpassung, der mehrdimensionalen oder der Skalar- und Wurzelanpassung.
  • Nehmen wir ein Beispiel von eine Skalarfunktion,um die minimale Skalarfunktion zu finden.
%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) 

Ausgang:

Optimierung und Anpassung in SciPy

Die Optimierung wurde erfolgreich beendet.

Aktueller Funktionswert: -23.241676

Iterationen: 4

Funktionsauswertungen: 18

Steigungsbewertungen: 6

Array([-1.67096375])

  • In diesem Beispiel erfolgt die Optimierung mit Hilfe des Gradientenabstiegsalgorithmus vom Anfangspunkt aus
  • Aber das mรถgliche Problem sind lokale Minima statt globaler Minima. Wenn wir keinen Nachbarn globaler Minima finden, mรผssen wir die globale Optimierung anwenden und die Funktion โ€žGlobale Minimaโ€œ finden, die als verwendet wird Beckenhopping() die lokalen Optimierer kombiniert.

optimieren.basinhopping(Funktion, 0)

Ausgang:

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

  • Der Nelder-Mead-Algorithmus wรคhlt anhand von Methodenparametern aus.
  • Es bietet die einfachste Mรถglichkeit zur Minimierung fรผr eine fair verhaltene Funktion.
  • Der Nelder-Mead-Algorithmus wird nicht fรผr Gradientenauswertungen verwendet, da es lรคnger dauern kann, die Lรถsung zu finden.
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")

Ausgang:

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

Bildverarbeitung mit SciPy โ€“ scipy.ndimage

  • scipy.ndimage ist ein Untermodul von SciPy, das hauptsรคchlich zur Durchfรผhrung einer bildbezogenen Operation verwendet wird
  • ndimage bedeutet das โ€žnโ€œ-dimensionale Bild.
  • SciPy Image Processing bietet geometrische Transformation (Drehen, Zuschneiden, Spiegeln), Bildfilterung (Scharfzeichnen und Entschรคrfen), Bildanzeige, Bildsegmentierung, Klassifizierung und Merkmalsextraktion.
  • MISC-Paket in SciPy enthรคlt vorgefertigte Bilder, die zur Durchfรผhrung von Bildbearbeitungsaufgaben verwendet werden kรถnnen

Ejemplo: Nehmen wir ein Beispiel fรผr die geometrische Transformation von Bildern

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

Ausgang:

Bildverarbeitung mit SciPy

Jetzt wir Flip nach unten aktuelles Bild:

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

Ausgang:

Bildverarbeitung mit SciPy

Ejemplo: Bilddrehung mit 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()

Ausgang:

Bildverarbeitung mit SciPy

Integration mit Scipy โ€“ Numerische Integration

  • Wenn wir eine Funktion integrieren, bei der eine analytische Integration nicht mรถglich ist, mรผssen wir uns der numerischen Integration zuwenden
  • SciPy bietet Funktionen zur Integration von Funktionen mit numerischer Integration.
  • scipy.integrieren Die Bibliothek verfรผgt รผber Einfachintegration, Doppel-, Dreifach-, Mehrfachintegration, GauรŸ-Quadrat-, Romberg-, Trapez- und Simpson-Regeln.

Ejemplo: Nehmen Sie nun ein Beispiel Einzelintegration

Integration mit Scipy

Hier a ist die Obergrenze und b ist die untere Grenze

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)

Ausgang:

(0.33333333333333337, 3.700743415417189e-15)

Hier gibt die Funktion zwei Werte zurรผck, wobei der erste Wert die Integration und der zweite Wert der geschรคtzte Fehler im Integral ist.

Beispiel: Nehmen Sie nun ein SciPy-Beispiel doppelte Integration. Wir finden die doppelte Integration der folgenden Gleichung,

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

Ausgang:

(3.0, 9.657432734515774e-14)

Sie haben die obige Ausgabe als dieselbe vorherige Ausgabe gesehen.

Zusammenfassung

  • SciPy (ausgesprochen โ€žSigh Piโ€œ) ist eine Open Source Python-basierte Bibliothek, die in der Mathematik, im wissenschaftlichen Rechnen, im Ingenieurwesen und im technischen Rechnen verwendet wird.
  • SciPy enthรคlt verschiedene Unterpakete, die bei der Lรถsung der hรคufigsten Probleme im Zusammenhang mit wissenschaftlichen Berechnungen helfen.
  • SciPy ist in NumPy integriert
Paketname Beschreibung
scipy.io Dateieingabe/-ausgabe
scipy.special Special Function
scipy.linalg Lineare Algebra OperaProduktion
scipy.interpolate Interpolation
scipy.optimize Optimierung und Passform
scipy.stats Statistik und Zufallszahlen
scipy.integrieren Numerische Integration
scipy.fftpack Schnelle Fourier-Transformationen
scipy.signal Signal Verarbeitung
scipy.ndimage Bildbearbeitung -

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: