« Python pour le calcul scientifique/Manipulation de matrices » : différence entre les versions

Contenu supprimé Contenu ajouté
m →‎Notes et références : nouveau précédent
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 3 :
# Les matrices sont l'élément de base du calcul vectorisé qui permet un gain de temps appréciable.
Pour pouvoir expliter les matrices, il faut charger le module NumPy ; nous utilisons également Matplotlib pour les graphiques. Ainsi, les programmes contiennent tous au début :
<sourcesyntaxhighlight lang="python">
import numpy as np
import matplotlib.pyplot as plt
</syntaxhighlight>
</source>
 
== Définir un tenseur ==
Ligne 12 :
 
'''Exemples'''
<sourcesyntaxhighlight lang="python">
a = np.array([1, 3, 5, 7]) # vecteur
bc = np.array([[1], [2], [3], [4]]) # matrice 4 × 1 (matrice colonne)
Ligne 24 :
[ 7, 6, 5]]]) # tenseur d'ordre 3, de dimension 3 × 2 × 2
</syntaxhighlight>
</source>
Notez que dans NumPy, un vecteur n'est pas la même chose qu'une matrice ligne ou colonne. Un vecteur de dimension ''n'' est un tenseur d'ordre 1 et de dimension ''n'' ; une matrice ligne ou colonne est un tenseur d'ordre 2 et de dimension 1 × ''n'' ou ''n'' × 1.
<sourcesyntaxhighlight lang="python">
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3]])
Ligne 33 :
print(a.ndim, b.ndim, c.ndim) # 1 2 2
print(a.shape, b.shape, c.shape) # (3,) (1, 3) (3, 1)
</syntaxhighlight>
</source>
 
La fonction <code>np.arange()</code> est similaire à la fonction <code>range()</code> pour les liste ; elle génère un vecteur de réels. La fonction <code>np.linspace()</code> permet également de créer un vecteur de même type mais on indique le dernier nombre alors que la règle du découpage en tranches fait que le nombre maximal indiqué à <code>np.arange()</code> est le premier nombre qui ne ''figure pas'' dans le vecteur.). La fonction <code>np.zeros()</code> génère une matrice nulle, <code>np.zeros_like()</code> une matrice nulle ayant les dimensions d'une matrice fournie comme modèle. De même, <code>np.ones()</code> et <code>np.ones_like()</code> crée des matrice dont toutes les composantes sont à 1. La fonction <code>np.eye()</code> crée une matrice unité.
 
'''Exemples'''
<sourcesyntaxhighlight lang="python">
e = np.arange(0, 2, 0.1) # vecteur [0, 0.1, 0.2…, 1.8, 1.9]
f = np.linspace(0, 2, 5) # 5 nombre entre 0 et 2 soit le vecteur [0, 0.5, 1, 1.5, 2]
Ligne 45 :
k = np.ones_like(a) # matrice de 1 de même dimension que a
u = np.eye(3) # matrice unité 3 × 3
</syntaxhighlight>
</source>
Le paramètre <code>dtype</code> permet de forcer le type. Par exemple
<sourcesyntaxhighlight lang="python">
a = np.array([1, 2, 3], dtype="complex")
k = np.ones_like(a, dtype="int")
</syntaxhighlight>
</source>
 
La méthode <code>.reshape()</code> remet en forme une matrice. Par exemple, pour transformer un vecteur de dimension 9 en une matrice 3 × 3 :
<sourcesyntaxhighlight lang="python">
a = np.arange(1, 10)
b = a.reshape(3, 3)
# ou bien directement
c = np.arange(1, 10).reshape(3, 3)
</syntaxhighlight>
</source>
La méthode <code>.fill()</code> remplit la matrice avec un scalaire :
<sourcesyntaxhighlight lang="python">
b.fill(5) # remplace les valeurs de b par la valeur 5
</syntaxhighlight>
</source>
 
== Calcul vectorisé ==
Ligne 68 :
Les fonctions de NumPy traitent en général les matrices en entier. Ainsi, il n'est pas nécessaire de créer une boucle pour faire défiler les indices un par un. Il en résulte un code clair et compact et surtout un plus grande rapidité d'exécution. Par exemple :
 
<sourcesyntaxhighlight lang="python">
x = np.linspace(0, 2*np.pi, 50) # 50 points entre 0 et 2π
y = np.sin(x)
plt.plot(x, y)
</syntaxhighlight>
</source>
La variable <code>x</code> est un vecteur de 50 valeurs et il est traité en une seule passe par la fonction sinus <code>np.sin()</code>.
 
Ligne 79 :
* utiliser un vecteur ou une matrice de booléens de même dimension que a matrice ; Python extrait alors les valeurs correspondant aux <code>True</code>, la matrice booléenne est un « masque » pour la matrice d'origine. Par exemple :
 
<sourcesyntaxhighlight lang="python">
a = np.arange(0, 10)
b = np.array([1, 3, 5, 7, 9])
c = np.array([True, True, False, False, True, False, True, False, False, True])
print(a[b], "\n", a[c])
</syntaxhighlight>
</source>
 
'''Exercice'''
Ligne 91 :
 
{{boîte déroulante début|Solution}}
<sourcesyntaxhighlight lang="python">
#!/usr/bin/env python
# coding: utf-8
Ligne 143 :
 
plt.plot(resultat, np.zeros_like(resultat), "|")
</syntaxhighlight>
</source>
 
L'extraction par un vecteur d'indice intervient dans l'instruction :
<sourcesyntaxhighlight lang="python">
indices[i*j-1]=False
</syntaxhighlight>
</source>
qui élimine en une seule passe tous les multiples de ''i''. L'extraction par un vecteur booléen intervient dans l'instruction :
<sourcesyntaxhighlight lang="python">
liste = liste0[indices]+1
</syntaxhighlight>
</source>
qui permet d'extraire toutes la valeurs conservées en une seule passe.
{{boîte déroulante fin}}
Ligne 163 :
* <code>.size</code> : nombre d'éléments ;
* <code>.dtype</code> : type des éléments.
<sourcesyntaxhighlight lang="python">
a = np.linspace(1, 9, 9)
print("a", a, "\n",
Ligne 170 :
" ; size : ", a.size,
" ; dtype : ", a.dtype, "\n")
</syntaxhighlight>
</source>
* <code>.real</code>, <code>.imag</code> : parties réelle et imaginaire de la matrice ;
* <code>.flat</code> : liste des éléments de la matrice ; les éléments sont réorganisés en une liste ;
* <code>.T</code> : transposée.
<sourcesyntaxhighlight lang="python">a = np.arange(0, 9).reshape(3, 3)
print(a)
# [[0 1 2]
Ligne 185 :
print(a.flat[:])
# array([0, 1, 2, 3, 4, 5, 6, 7, 8])
</syntaxhighlight>
</source>
; Ressources
: Section « Attribute », {{lien web
Ligne 202 :
* <code>.sum()</code>, <code>prod()</code> : somme et produit de tous les éléments de la matrice ;
* <code>.cumsum()</code>, <code>cumprod()</code> : somme et produit cumulés.
<sourcesyntaxhighlight lang="python">
a = np.linspace(1, 9, 9)
print("min : ", a.min(),
Ligne 210 :
"prod : ", a.prod(),
"; cumprod : ", a.cumprod(), "\n")
</syntaxhighlight>
</source>
 
Méthodes statistiques :
Ligne 220 :
* <code>.flatten()</code> : vecteur contenant les éléments réorganisés en liste ; par rapport à l'attribut <code>.flat</code>, on peut choisir le sens de linéarisation (par lignes, <code>.flatten(C)</code>, ou par colonnes, <code>.flatten(F)</code>) mais cela crée une copie, on ne peut pas par exemple s'en servir pour modifier la matrice ;
* <code>.tofile()</code> : crée un fichier texte contenant les valeurs de la matrice ; par exemple, pour une matrice <code>a</code> et pour séparer les valeurs par un point-virgule :
<sourcesyntaxhighlight lang="python">
a.tofile("matriceA.txt", sep=" ; ")
</syntaxhighlight>
</source>
 
Algèbre linéaire :
Ligne 258 :
: <math>5 + \mathrm{A} = \begin{pmatrix} 5 & 5 \\ 5 & 5 \end{pmatrix} + \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} </math>
:: La matrice (5) est de dimension 1 × 1, la valeur « 5 » est donc répétée dans les deux dimensions
<sourcesyntaxhighlight lang="python">
A = np.array([[1, 2], [3, 4]])
print(5 + A)
# [[6 7]
# [7 8]]
</syntaxhighlight>
</source>
: <math>(5, 4) + \mathrm{A} = \begin{pmatrix} 5 & 4 \\ 5 & 4 \end{pmatrix} + \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} </math>
<sourcesyntaxhighlight lang="python">
print(np.array([[5, 4]]) + A)
# [[6 6]
# [6 8]]
</syntaxhighlight>
</source>
: <math>\begin{pmatrix} 5 \\ 4 \end{pmatrix} + \mathrm{A} = \begin{pmatrix} 5 & 5 \\ 4 & 4 \end{pmatrix} + \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} </math>
<sourcesyntaxhighlight lang="python">
print(np.array([[5], [4]]) + A)
# [[6 7]
# [7 8]]
</syntaxhighlight>
</source>
 
== Fonctions « universelles » ==