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 python pur, et je soupçonne qu'il y a des modules plus rapides pour le faire.

55
demandé sur Amro 2008-10-17 09:30:49

6 réponses

vous devriez jeter un oeil à numpy si vous faites la manipulation de matrice. 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 de faire 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 jeter un oeil au module array , qui est une implémentation beaucoup plus efficace des listes lorsque vous avez à traiter avec un seul type de données.

100
répondu Mapad 2017-06-13 12:07:43

assurez-vous que vous avez vraiment besoin d'inverser la matrice. Ce est souvent inutile et peut être numériquement instable. Quand 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 le code qui résout l'équation Ax = b Pour x directement que de calculer un inverse puis de multiplier l'inverse par B. même si vous avez besoin de résoudre Ax = b Pour de nombreuses valeurs de b, ce n'est pas une bonne idée de inversez A. Si vous devez résoudre le système pour plusieurs valeurs de b, sauvegardez la factorisation Cholesky de A, mais ne l'inversez pas.

voir n'inversez pas cette matrice .

52
répondu John D. Cook 2010-04-16 19:59:46

il est dommage que la matrice choisie, répétée ici encore, soit singulière ou 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. Les termes sont très, très importants par rapport à la terminologie termes de la matrice A originale...

il est remarquable que les humains en choisissant un exemple d'une matrice parviennent si souvent à choisir une matrice singulière!

j'ai eu un problème avec la solution, donc regardé en plus loin. 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 aussi être importé.

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

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 invendables d'arrondi.

Merci pour votre contribution,

OldAl.

10
répondu user377367 2010-06-27 21:19:14

vous pourriez calculer le déterminant de la matrice qui est récursive et puis former la matrice jointe

voici un petit tutoriel

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

une autre façon de calculer cela implique gram-schmidt orthogonalisation et ensuite la transposition de la matrice, la transposition d'une matrice orthogonalisée est son inverse!

6
répondu dbr 2010-06-12 09:54:22

Numpy sera adapté pour la plupart des gens, mais vous pouvez également faire matrices en Sympy

essayez d'exécuter ces commandes à http://live.sympy.org /

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

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

5
répondu Colonel Panic 2015-06-17 13:02:36

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

(je voudrais également écho à vous faire vous avez vraiment besoin pour inverser la matrice. Dans R, par exemple, linalg.résolve et la fonction resolve() ne font pas réellement une inversion complète, puisque c'est inutile.)

1
répondu Gregg Lind 2008-12-16 17:19:22