SciPy in Python Εκμάθηση: Τι είναι, Βιβλιοθήκη, Λειτουργία & Παραδείγματα

SciPy in Python

SciPy in Python είναι μια βιβλιοθήκη ανοιχτού κώδικα που χρησιμοποιείται για την επίλυση μαθηματικών, επιστημονικών, μηχανικών και τεχνικών προβλημάτων. Επιτρέπει στους χρήστες να χειρίζονται τα δεδομένα και να οπτικοποιούν τα δεδομένα χρησιμοποιώντας ένα ευρύ φάσμα υψηλού επιπέδου Python εντολές. Το SciPy είναι χτισμένο πάνω στο Python Επέκταση NumPy. Το SciPy προφέρεται επίσης ως "Sigh Pi".

Υποπακέτα του SciPy:

Γιατί να χρησιμοποιήσετε το SciPy

  • Το SciPy περιέχει ποικιλίες υποπακέτων που βοηθούν στην επίλυση του πιο συνηθισμένου ζητήματος που σχετίζεται με τον Επιστημονικό Υπολογισμό.
  • Πακέτο SciPy μέσα Python είναι η πιο χρησιμοποιούμενη επιστημονική βιβλιοθήκη μόλις δεύτερη μετά την επιστημονική βιβλιοθήκη GNU για C/C++ ή του Matlab.
  • Εύκολο στη χρήση και κατανόηση καθώς και γρήγορη υπολογιστική ισχύ.
  • Μπορεί να λειτουργήσει σε μια σειρά βιβλιοθήκης NumPy.

Numpy VS SciPy

Νούμπι

  • Το Numpy γράφεται σε C και χρησιμοποιείται για μαθηματικούς ή αριθμητικούς υπολογισμούς.
  • Είναι πιο γρήγορο από άλλα Python βιβλιοθήκες
  • Η Numpy είναι η πιο χρήσιμη βιβλιοθήκη για την Επιστήμη Δεδομένων για την εκτέλεση βασικών υπολογισμών.
  • Το Numpy δεν περιέχει τίποτα άλλο εκτός από τον τύπο δεδομένων πίνακα που εκτελεί την πιο βασική λειτουργία όπως ταξινόμηση, διαμόρφωση, ευρετηρίαση κ.λπ.

SciPy

  • Το SciPy είναι ενσωματωμένο στην κορυφή του NumPy
  • Η μονάδα SciPy μέσα Python είναι μια πλήρως εξοπλισμένη έκδοση της Γραμμικής Άλγεβρας, ενώ το Numpy περιέχει μόνο μερικά χαρακτηριστικά.
  • Οι περισσότερες νέες λειτουργίες Data Science είναι διαθέσιμες στο Scipy και όχι στο Numpy.

SciPy – Εγκατάσταση και Ρύθμιση περιβάλλοντος

Μπορείτε επίσης να εγκαταστήσετε το SciPy στο Windows μέσω pip

Python3 -m pip install --user numpy scipy 

Εγκαταστήστε το Scipy σε Linux

sudo apt-get install  python-scipy python-numpy

Εγκαταστήστε το SciPy σε Mac

sudo port install py35-scipy py35-numpy

Πριν αρχίσουμε να μαθαίνουμε το SciPy Python, πρέπει να γνωρίζετε τη βασική λειτουργικότητα καθώς και διαφορετικούς τύπους μιας συστοιχίας μουδιασμένος

Ο τυπικός τρόπος εισαγωγής μονάδων SciPy και Numpy:

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

Πακέτο εισόδου/εξόδου αρχείου

Το Scipy, πακέτο εισόδου/εξόδου, διαθέτει ένα ευρύ φάσμα λειτουργιών για εργασία με διαφορετικές μορφές αρχείων που είναι Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV και δυαδική μορφή.

Ας πάρουμε μια μορφή αρχείου Python Παράδειγμα SciPy που χρησιμοποιούνται τακτικά στο 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']

Παραγωγή:

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

Επεξήγηση κώδικα

  • Γραμμή 1 & 2: Εισαγάγετε τη βασική βιβλιοθήκη SciPy Python με πακέτο I/O και Numpy.
  • Γραμμή 3: Δημιουργία 4 x 4, διαστάσεων πίνακα ενός
  • Γραμμή 4: Αποθήκευση συστοιχίας μέσα παράδειγμα.ματ αρχείο.
  • Γραμμή 5: Λάβετε δεδομένα από παράδειγμα.ματ φιλέτο
  • Γραμμή 6: Έξοδος εκτύπωσης.

Ειδικό πακέτο λειτουργιών

  • πικραμένος.ειδικός Το πακέτο περιέχει πολλές συναρτήσεις της μαθηματικής φυσικής.
  • Η ειδική λειτουργία SciPy περιλαμβάνει κυβική ρίζα, εκθετικό, λογαριαστό εκθετικό, Lambert, μετάθεση και συνδυασμούς, γάμμα, Bessel, υπεργεωμετρικό, Kelvin, βήτα, παραβολικό κύλινδρο, Εκθετικό σχετικό σφάλμα κ.λπ.
  • Για περιγραφή μιας γραμμής όλες αυτές οι λειτουργίες, πληκτρολογήστε Python κονσόλα:
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 βρίσκει την κυβική ρίζα των τιμών.

Σύνταξη:

scipy.special.cbrt(x)

Παράδειγμα:

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

Παραγωγή: πίνακας ([3., 4.])

Εκθετικη συναρτηση:

Η εκθετική συνάρτηση υπολογίζει το στοιχείο 10**x.

Παράδειγμα:

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

Παραγωγή: [1.e+01 1.e+10]

Μεταθέσεις & Συνδυασμοί

Το SciPy παρέχει επίσης λειτουργικότητα για τον υπολογισμό Μεταθέσεων και Συνδυασμών.

Συνδυασμοί - scipy.special.comb(N,k)

Παράδειγμα:

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)

Παραγωγή: 15.0

Μεταθέσεις -

scipy.special.perm(N,k)

Παράδειγμα:

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

Παραγωγή: 20

Εκθετική συνάρτηση ημερολογιακού αθροίσματος

Το Log Sum Exponential υπολογίζει το ημερολόγιο του αθροίσματος εκθετικού στοιχείου εισόδου.

Σύνταξη :

scipy.special.logsumexp(x) 

Λειτουργία Bessel

Νη συνάρτηση υπολογισμού ακέραιου αριθμού

Σύνταξη :

scipy.special.jn()

Γραμμική Άλγεβρα με SciPy

  • Η Γραμμική Άλγεβρα του SciPy είναι μια υλοποίηση των βιβλιοθηκών BLAS και ATLAS LAPACK.
  • Η απόδοση της Γραμμικής Άλγεβρας είναι πολύ γρήγορη σε σύγκριση με το BLAS και το LAPACK.
  • Η ρουτίνα γραμμικής άλγεβρας δέχεται αντικείμενο δισδιάστατου πίνακα και η έξοδος είναι επίσης ένας δισδιάστατος πίνακας.

Τώρα ας κάνουμε μια δοκιμή με scipy.linalg,

Υπολογισμός καθοριστικός ενός δισδιάστατου πίνακα,

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 )

Παραγωγή: -7.0

Αντίστροφη μήτρα -

scipy.linalg.inv()

Το Inverse Matrix of Scipy υπολογίζει το αντίστροφο οποιουδήποτε τετραγωνικού πίνακα.

Ας δούμε,

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 )

Παραγωγή:

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

Ιδιοτιμές και ιδιοδιάνυσμα

scipy.linalg.eig()

  • Το πιο κοινό πρόβλημα στη γραμμική άλγεβρα είναι οι ιδιοτιμές και το ιδιοδιάνυσμα που μπορούν εύκολα να λυθούν χρησιμοποιώντας eig()λειτουργία.
  • Τώρα ας βρούμε την ιδιοτιμή του (X) και αντιστοιχεί ιδιοδιάνυσμα ενός δισδιάστατου τετραγωνικού πίνακα.

Παράδειγμα

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)

Παραγωγή:

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

Διακριτός μετασχηματισμός Fourier – scipy.fftpack

  • Το DFT είναι μια μαθηματική τεχνική που χρησιμοποιείται για τη μετατροπή χωρικών δεδομένων σε δεδομένα συχνότητας.
  • Ο FFT (Fast Fourier Transformation) είναι ένας αλγόριθμος για τον υπολογισμό του DFT
  • Το FFT εφαρμόζεται σε έναν πολυδιάστατο πίνακα.
  • Η συχνότητα καθορίζει τον αριθμό του σήματος ή του μήκους κύματος σε μια συγκεκριμένη χρονική περίοδο.

Παράδειγμα: Πάρτε ένα κύμα και εμφανίστε χρησιμοποιώντας τη βιβλιοθήκη Matplotlib. παίρνουμε παράδειγμα απλής περιοδικής συνάρτησης 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()

Παραγωγή:

Διακριτός μετασχηματισμός Fourier

Μπορείτε να το δείτε αυτό. Η συχνότητα είναι 5 Hz και το σήμα της επαναλαμβάνεται σε 1/5 δευτερόλεπτο – καλείται ως συγκεκριμένη χρονική περίοδος.

Τώρα ας χρησιμοποιήσουμε αυτό το ημιτονοειδές κύμα με τη βοήθεια της εφαρμογής 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()

Παραγωγή:

Διακριτός μετασχηματισμός Fourier

  • Μπορείτε να δείτε ξεκάθαρα ότι η έξοδος είναι ένας μονοδιάστατος πίνακας.
  • Η είσοδος που περιέχει μιγαδικές τιμές είναι μηδέν εκτός από δύο σημεία.
  • Στο παράδειγμα DFT απεικονίζουμε το μέγεθος του σήματος.

Optimization and Fit in SciPy – scipy.optimize

  • Η βελτιστοποίηση παρέχει έναν χρήσιμο αλγόριθμο για την ελαχιστοποίηση της προσαρμογής καμπύλης, πολυδιάστατης ή κλιμακωτής και ριζικής προσαρμογής.
  • Ας πάρουμε ένα παράδειγμα μια βαθμωτή συνάρτηση,για να βρείτε την ελάχιστη βαθμωτή συνάρτηση.
%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) 

Παραγωγή:

Βελτιστοποίηση και εφαρμογή στο SciPy

Η βελτιστοποίηση τερματίστηκε με επιτυχία.

Τρέχουσα τιμή συνάρτησης: -23.241676

Επαναλήψεις: 4

Αξιολογήσεις συναρτήσεων: 18

Αξιολογήσεις κλίσης: 6

πίνακας ([-1.67096375])

  • Σε αυτό το παράδειγμα, η βελτιστοποίηση γίνεται με τη βοήθεια του αλγόριθμου gradient descent από το αρχικό σημείο
  • Αλλά το πιθανό ζήτημα είναι τα τοπικά ελάχιστα αντί για τα παγκόσμια ελάχιστα. Εάν δεν βρούμε έναν γείτονα των καθολικών ελάχιστων, τότε πρέπει να εφαρμόσουμε καθολική βελτιστοποίηση και να βρούμε τη συνάρτηση καθολικών ελάχιστων που χρησιμοποιείται ως basinhopping() που συνδυάζει τοπικό βελτιστοποιητή.

optimize.basinhopping(συνάρτηση, 0)

Παραγωγή:

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:

  • Ο αλγόριθμος Nelder-Mead επιλέγει μέσω της παραμέτρου μεθόδου.
  • Παρέχει τον πιο απλό τρόπο ελαχιστοποίησης για λειτουργία δίκαιης συμπεριφοράς.
  • Ο αλγόριθμος Nelder – Mead δεν χρησιμοποιείται για αξιολογήσεις διαβάθμισης επειδή μπορεί να χρειαστεί περισσότερος χρόνος για να βρεθεί η λύση.
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")

Παραγωγή:

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

Επεξεργασία εικόνας με SciPy – scipy.ndimage

  • Το scipy.ndimage είναι μια υπομονάδα του SciPy που χρησιμοποιείται κυρίως για την εκτέλεση μιας λειτουργίας σχετικής με την εικόνα
  • ndimage σημαίνει την εικόνα διαστάσεων "n".
  • Το SciPy Image Processing παρέχει μετασχηματισμό γεωμετρικών στοιχείων (περιστροφή, περικοπή, αναστροφή), φιλτράρισμα εικόνας (ευκρινή και αφαίρεση μύτης), εικόνα εμφάνισης, τμηματοποίηση εικόνας, ταξινόμηση και εξαγωγή χαρακτηριστικών.
  • Πακέτο MISC στο SciPy περιέχει προκατασκευασμένες εικόνες που μπορούν να χρησιμοποιηθούν για την εκτέλεση εργασιών χειρισμού εικόνων

Παράδειγμα: Ας πάρουμε ένα παράδειγμα γεωμετρικού μετασχηματισμού εικόνων

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

Παραγωγή:

Επεξεργασία εικόνας με το SciPy

Τώρα εμείς Αναστροφή προς τα κάτω τρέχουσα εικόνα:

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

Παραγωγή:

Επεξεργασία εικόνας με το SciPy

Παράδειγμα: Περιστροφή εικόνας με χρήση 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()

Παραγωγή:

Επεξεργασία εικόνας με το SciPy

Ολοκλήρωση με Scipy – Αριθμητική Ολοκλήρωση

  • Όταν ενσωματώνουμε οποιαδήποτε συνάρτηση όπου η αναλυτική ολοκλήρωση δεν είναι δυνατή, πρέπει να στραφούμε για αριθμητική ολοκλήρωση
  • Το SciPy παρέχει λειτουργικότητα για την ενοποίηση συνάρτησης με αριθμητική ολοκλήρωση.
  • σκωπτικός.ενσωματώνω Η βιβλιοθήκη έχει απλή ολοκλήρωση, διπλή, τριπλή, πολλαπλή, Gaussian τετράγωνο, Romberg, Trapezoidal και κανόνες Simpson.

Παράδειγμα: Πάρτε τώρα ένα παράδειγμα Ενιαία Ένταξη

Ενσωμάτωση με το Scipy

Εδώ a είναι το ανώτατο όριο και b είναι το κατώτερο όριο

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)

Παραγωγή:

(0.33333333333333337, 3.700743415417189e-15)

Εδώ η συνάρτηση επιστρέφει δύο τιμές, στις οποίες η πρώτη τιμή είναι η ολοκλήρωση και η δεύτερη τιμή είναι το εκτιμώμενο σφάλμα στο ολοκλήρωμα.

Παράδειγμα: Πάρτε τώρα ένα παράδειγμα SciPy διπλή ολοκλήρωση. Βρίσκουμε τη διπλή ολοκλήρωση της ακόλουθης εξίσωσης,

Ενσωμάτωση με το 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)

Παραγωγή:

(3.0, 9.657432734515774e-14)

Έχετε δει την παραπάνω έξοδο όπως η ίδια προηγούμενη.

Σύνοψη

  • Το SciPy (προφέρεται ως "Sigh Pi") είναι ανοιχτού κώδικα Python-βασισμένη βιβλιοθήκη, η οποία χρησιμοποιείται στα μαθηματικά, την επιστημονική πληροφορική, τη μηχανική και την τεχνική πληροφορική.
  • Το SciPy περιέχει ποικιλίες υποπακέτων που βοηθούν στην επίλυση του πιο συνηθισμένου ζητήματος που σχετίζεται με τον Επιστημονικό Υπολογισμό.
  • Το SciPy είναι ενσωματωμένο στην κορυφή του NumPy
Όνομα πακέτου Descriptιόν
scipy.io Είσοδος/Έξοδος αρχείου
πικραμένος.ειδικός Ειδική λειτουργία
scipy.linalg Γραμμική άλγεβρα Operaσμού
scipy.επεμβαίνω Παρεμβολή
scipy.βελτιστοποιώ Βελτιστοποίηση και εφαρμογή
scipy.stats Στατιστικά στοιχεία και τυχαίοι αριθμοί
σκωπτικός.ενσωματώνω Αριθμητική Ολοκλήρωση
scipy.fftpack Γρήγορες μεταμορφώσεις Fourier
σκωπτικός.σήμα Signal Επεξεργασία
scipy.ndimage Χειρισμός εικόνας –