web-dev-qa-db-fra.com

Python Inverse d'une matrice

Comment obtenir l'inverse d'une matrice en python? Je l'ai implémenté moi-même, mais c'est du pur python, et je soupçonne qu'il existe des modules plus rapides pour le faire.

57
Claudiu

Vous devriez jeter un œil à numpy si vous faites de la manipulation matricielle. Il s'agit d'un module principalement écrit en C, qui sera beaucoup plus rapide que la programmation en python pur. Voici un exemple de la façon d'inverser une matrice et d'effectuer d'autres manipulations de matrice.

from numpy import matrix
from numpy import linalg
A = matrix( [[1,2,3],[11,12,13],[21,22,23]]) # Creates a matrix.
x = matrix( [[1],[2],[3]] )                  # Creates a matrix (like a column vector).
y = matrix( [[1,2,3]] )                      # Creates a matrix (like a row vector).
print A.T                                    # Transpose of A.
print A*x                                    # Matrix multiplication of A and x.
print A.I                                    # Inverse of A.
print linalg.solve(A, x)     # Solve the linear equation system.

Vous pouvez également consulter le module array , qui est une implémentation beaucoup plus efficace des listes lorsque vous ne devez traiter qu'avec un seul type de données.

102
Mapad

Assurez-vous que vous devez vraiment inverser la matrice. Ceci est souvent inutile et peut être numériquement instable. Lorsque la plupart des gens demandent comment inverser une matrice, ils veulent vraiment savoir comment résoudre Ax = b où A est une matrice et x et b sont des vecteurs. Il est plus efficace et plus précis d'utiliser du code qui résout l'équation Ax = b pour x directement que de calculer A inverse puis de multiplier l'inverse par B. Même si vous devez résoudre Ax = b pour de nombreuses valeurs b, ce n'est pas une bonne idée pour inverser A. Si vous devez résoudre le système pour plusieurs valeurs b, enregistrez la factorisation de Cholesky de A, mais ne l'inversez pas.

Voir N'inversez pas cette matrice .

53
John D. Cook

Dommage que la matrice choisie, répétée ici encore, soit soit singulière soit mal conditionnée:

A = matrix( [[1,2,3],[11,12,13],[21,22,23]])

Par définition, l'inverse de A lorsqu'il est multiplié par la matrice A elle-même doit donner une matrice unitaire. Le A choisi dans l'explication très louée ne fait pas cela. En fait, le simple fait de regarder l'inverse donne un indice que l'inversion n'a pas fonctionné correctement. Regardez l'ampleur des termes individuels - ils sont très, très grands par rapport aux termes de la matrice A d'origine ...

Il est remarquable que les humains, lorsqu'ils choisissent un exemple de matrice, parviennent si souvent à choisir une matrice singulière!

J'ai eu un problème avec la solution, alors j'ai approfondi la question. Sur la plate-forme ubuntu-kubuntu, le paquet debian numpy n'a pas la matrice et les sous-paquets linalg, donc en plus de l'importation de numpy, scipy doit également être importé.

Si les termes diagonaux de A sont multipliés par un facteur suffisamment grand, disons 2, la matrice cessera très probablement d'être singulière ou presque singulière. Alors

A = matrix( [[2,2,3],[11,24,13],[21,22,46]])

ne devient ni singulier ni presque singulier et l'exemple donne des résultats significatifs ... Lorsqu'il s'agit de nombres flottants, il faut être attentif aux effets des erreurs d'arrondi inévitables.

Merci pour votre contribution,

OldAl.

10
user377367

Vous pouvez calculer le déterminant de la matrice qui est récursif puis former la matrice contiguë

Voici un petit tutoriel

Je pense que cela ne fonctionne que pour les matrices carrées

Une autre façon de les calculer implique l'orthogonalisation gram-schmidt puis la transposition de la matrice, la transposition d'une matrice orthogonalisée est son inverse!

6
lee

Numpy conviendra à la plupart des gens, mais vous pouvez aussi le faire matrices dans Sympy

Essayez d'exécuter ces commandes sur http://live.sympy.org/

M = Matrix([[1, 3], [-2, 3]])
M
M**-1

Pour le plaisir, essayez M**(1/2)

5
Colonel Panic

Si vous détestez numpy, sortez RPy et votre copie locale de R, et utilisez-le à la place.

(Je voudrais également faire écho pour vous dire que vous avez vraiment besoin d'inverser la matrice. Dans R, par exemple, linalg.solve et la fonction resol () ne font pas réellement une inversion complète, car cela n'est pas nécessaire.)

1
Gregg Lind