SciPy dans Python Tutoriel : Qu'est-ce que c'est, bibliothèque, fonction et exemples

SciPy dans Python

SciPy dans Python est une bibliothèque open source utilisée pour résoudre des problèmes mathématiques, scientifiques, d'ingénierie et techniques. Il permet aux utilisateurs de manipuler les données et de les visualiser à l'aide d'un large éventail d'outils de haut niveau. Python commandes. SciPy est construit sur le Python Extension NumPy. SciPy se prononce également « Sigh Pi ».

Sous-packages de SciPy :

Pourquoi utiliser SciPy

  • SciPy contient une variété de sous-packages qui aident à résoudre le problème le plus courant lié au calcul scientifique.
  • Paquet SciPy dans Python est la bibliothèque scientifique la plus utilisée, juste derrière la bibliothèque scientifique GNU pour C/C++ ou celui de Matlab.
  • Facile à utiliser et à comprendre ainsi qu’une puissance de calcul rapide.
  • Il peut fonctionner sur un tableau de bibliothèques NumPy.

Numpy contre SciPy

Numpy

  • Numpy est écrit en C et utilisé pour les calculs mathématiques ou numériques.
  • C'est plus rapide que les autres Python Bibliothèques
  • Numpy est la bibliothèque la plus utile pour la science des données pour effectuer des calculs de base.
  • Numpy ne contient rien d'autre qu'un type de données tableau qui effectue les opérations les plus élémentaires comme le tri, la mise en forme, l'indexation, etc.

SciPy

  • SciPy est construit au-dessus de NumPy
  • Module SciPy dans Python est une version complète de l'algèbre linéaire tandis que Numpy ne contient que quelques fonctionnalités.
  • La plupart des nouvelles fonctionnalités de Data Science sont disponibles dans Scipy plutôt que dans Numpy.

SciPy – Installation et configuration de l’environnement

Vous pouvez également installer SciPy dans Windows via pip

Python3 -m pip install --user numpy scipy 

Installer Scipy sur Linux

sudo apt-get install  python-scipy python-numpy

Installer SciPy sur Mac

sudo port install py35-scipy py35-numpy

Avant de commencer à apprendre SciPy Python, vous devez connaître les fonctionnalités de base ainsi que les différents types d'une gamme de NumPy

La manière standard d'importer des modules SciPy et Numpy :

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

Package d'entrée/sortie de fichier

Scipy, package d'E/S, dispose d'un large éventail de fonctions pour travailler avec différents formats de fichiers qui sont Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV et le format binaire.

Prenons un format de fichier Python Exemple SciPy qui sont régulièrement utilisés dans 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']

Sortie :

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

Explication du code

  • Ligne 1 & 2 : Importez la bibliothèque SciPy essentielle dans Python avec le package d'E/S et Numpy.
  • Ligne 3: Créer un tableau dimensionnel de 4 x 4
  • Ligne 4: Stocker le tableau dans exemple.mat fichier.
  • Ligne 5: Obtenir des données de exemple.mat filet
  • Ligne 6: Sortie d'impression.

Pack de fonctions spéciales

  • scipy.spécial Le package contient de nombreuses fonctions de physique mathématique.
  • La fonction spéciale de SciPy comprend la racine cubique, l'exponentielle, l'exponentielle de la somme logarithmique, Lambert, la permutation et les combinaisons, Gamma, Bessel, hypergéométrique, Kelvin, bêta, cylindre parabolique, exponentielle d'erreur relative, etc.
  • Pour une description en une ligne de toutes ces fonctions, tapez Python console:
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.

Fonction racine cubique

La fonction Racine cubique trouve la racine cubique des valeurs.

syntaxe:

scipy.special.cbrt(x)

Mise en situation :

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

Sortie : tableau([3., 4.])

Fonction exponentielle:

La fonction exponentielle calcule le 10**x élément par élément.

Mise en situation :

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

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

Permutations et combinaisons

SciPy offre également des fonctionnalités pour calculer les permutations et les combinaisons.

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

Mise en situation :

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)

Sortie : 15.0

Permutations –

scipy.special.perm(N,k)

Mise en situation :

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

Sortie : 20

Fonction exponentielle de la somme du journal

Log Sum Exponential calcule le journal de l'élément d'entrée somme exponentielle.

Syntaxe :

scipy.special.logsumexp(x) 

Fonction Bessel

Fonction de calcul du nième ordre entier

Syntaxe :

scipy.special.jn()

Algèbre linéaire avec SciPy

  • L'algèbre linéaire de SciPy est une implémentation des bibliothèques BLAS et ATLAS LAPACK.
  • Les performances de l'algèbre linéaire sont très rapides par rapport à BLAS et LAPACK.
  • La routine d'algèbre linéaire accepte un objet tableau à deux dimensions et la sortie est également un tableau à deux dimensions.

Faisons maintenant quelques tests avec scipy.linalg,

Calculateur déterminant d'une matrice bidimensionnelle,

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 )

Sortie : - 7.0

Matrice inverse –

scipy.linalg.inv()

La matrice inverse de Scipy calcule l'inverse de n'importe quelle matrice carrée.

Voyons,

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 )

Sortie :

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

Valeurs propres et vecteur propre

scipy.linalg.eig()

  • Le problème le plus courant en algèbre linéaire est celui des valeurs propres et du vecteur propre qui peuvent être facilement résolus en utilisant eig()la fonction.
  • Trouvons maintenant la valeur propre de (X) et correspondent au vecteur propre d'une matrice carrée bidimensionnelle.

Exemple

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)

Sortie :

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

Transformée de Fourier discrète – scipy.fftpack

  • DFT est une technique mathématique utilisée pour convertir des données spatiales en données de fréquence.
  • FFT (Fast Fourier Transformation) est un algorithme de calcul de DFT
  • FFT est appliqué à un tableau multidimensionnel.
  • La fréquence définit le nombre de signaux ou de longueurs d'onde au cours d'une période de temps particulière.

Mise en situation : Faites une vague et montrez-la en utilisant la bibliothèque Matplotlib. nous prenons un exemple de fonction périodique simple de 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()

Sortie :

Transformée de Fourier discrète

Vous pouvez voir ça. La fréquence est de 5 Hz et son signal se répète toutes les 1/5 secondes – c'est ce qu'on appelle une période de temps particulière.

Utilisons maintenant cette onde sinusoïdale à l'aide de l'application 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()

Sortie :

Transformée de Fourier discrète

  • Vous pouvez clairement voir que la sortie est un tableau unidimensionnel.
  • Les entrées contenant des valeurs complexes sont nulles sauf deux points.
  • Dans l'exemple DFT, nous visualisons l'amplitude du signal.

Optimisation et ajustement dans SciPy – scipy.optimize

  • L'optimisation fournit un algorithme utile pour minimiser l'ajustement de courbe, l'ajustement multidimensionnel ou scalaire et racine.
  • Prenons un exemple de une fonction scalaire,pour trouver la fonction scalaire minimale.
%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) 

Sortie :

Optimisation et ajustement dans SciPy

L'optimisation s'est terminée avec succès.

Valeur de fonction actuelle : -23.241676

Itérations : 4

Évaluations fonctionnelles : 18

Évaluations de dégradé : 6

tableau([-1.67096375])

  • Dans cet exemple, l'optimisation est effectuée à l'aide de l'algorithme de descente de gradient à partir du point initial
  • Mais le problème possible réside dans les minimums locaux plutôt que dans les minimums globaux. Si nous ne trouvons pas de voisin des minima globaux, alors nous devons appliquer une optimisation globale et trouver la fonction des minima globaux utilisée comme saut de bassin() qui combine un optimiseur local.

optimiser.basinhopping(fonction, 0)

Sortie :

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

Algorithme Nelder-Mead :

  • L'algorithme de Nelder-Mead sélectionne via le paramètre de méthode.
  • Il fournit le moyen de minimisation le plus simple pour un fonctionnement équitable.
  • L'algorithme de Nelder – Mead n'est pas utilisé pour les évaluations de gradient car la recherche de la solution peut prendre plus de temps.
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")

Sortie :

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

Traitement d'images avec SciPy – scipy.ndimage

  • scipy.ndimage est un sous-module de SciPy qui est principalement utilisé pour effectuer une opération liée à l'image
  • ndimage signifie l’image à « n » dimensions.
  • SciPy Image Processing fournit une transformation géométrique (rotation, recadrage, retournement), un filtrage d'image (netteté et dénosage), une image d'affichage, une segmentation d'image, une classification et une extraction de caractéristiques.
  • Forfait DIVERS dans SciPy contient des images prédéfinies qui peuvent être utilisées pour effectuer des tâches de manipulation d'images

Mise en situation : Prenons un exemple de transformation géométrique d'images

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

Sortie :

Traitement d'images avec SciPy

Maintenant nous Rabattable Image actuelle:

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

Sortie :

Traitement d'images avec SciPy

Mise en situation : Rotation de l'image à l'aide de 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()

Sortie :

Traitement d'images avec SciPy

Intégration avec Scipy – Intégration numérique

  • Lorsque nous intégrons une fonction pour laquelle l’intégration analytique n’est pas possible, nous devons nous tourner vers l’intégration numérique.
  • SciPy fournit des fonctionnalités pour intégrer une fonction avec une intégration numérique.
  • scipy.intégrer La bibliothèque a des règles d'intégration simple, double, triple, multiple, quadrate gaussien, Romberg, trapézoïdale et Simpson.

Mise en situation : Prenons maintenant un exemple de Intégration unique

Intégration avec Scipy

Ici a est la limite supérieure et b est la limite inférieure

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)

Sortie :

(0.33333333333333337, 3.700743415417189e-15)

Ici, la fonction renvoie deux valeurs, dans lesquelles la première valeur est l'intégration et la deuxième valeur est l'erreur estimée en intégrale.

Exemple : prenons maintenant un exemple SciPy de double intégration. On retrouve la double intégration de l’équation suivante,

Intégration avec 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)

Sortie :

(3.0, 9.657432734515774e-14)

Vous avez vu la sortie ci-dessus comme la même précédente.

Résumé

  • SciPy (prononcé comme « Sigh Pi ») est un logiciel Open Source Python-bibliothèque basée sur les mathématiques, le calcul scientifique, l'ingénierie et le calcul technique.
  • SciPy contient une variété de sous-packages qui aident à résoudre le problème le plus courant lié au calcul scientifique.
  • SciPy est construit au-dessus de NumPy
Nom du forfait Description
scipy.io Entrée/sortie de fichier
scipy.spécial Fonction spéciale
scipy.linalg Algèbre linéaire Operaproduction
scipy.interpoler interpolation
scipy.optimiser Optimisation et ajustement
scipy.stats Statistiques et nombres aléatoires
scipy.intégrer Intégration numérique
scipy.fftpack Transformations de Fourier rapides
scipy.signal Signal Gestion
scipy.ndimage Manipulation d'images –