2008-10-17 30 views
55

Comment obtenir l'inverse d'une matrice en python? Je l'ai implémenté moi-même, mais c'est un python pur, et je suppose qu'il y a des modules plus rapides pour le faire.Inverser Python d'une matrice

+0

pouvez-vous s'il vous plaît montrer votre algorithme? –

+0

il y a ici répondre, si quelqu'un veut un extrait de code https://stackoverflow.com/questions/32114054/matrix-inversion-without-numpy – Alex

Répondre

99

Vous devriez regarder numpy si vous manipulez la matrice. C'est un module principalement écrit en C, qui sera beaucoup plus rapide que la programmation en python pur. Voici un exemple d'inversion d'une matrice et d'autres manipulations matricielles.

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 sur le module array, qui est une mise en œuvre beaucoup plus efficace des listes lorsque vous avez à traiter avec un seul type de données.

+0

numpy est également en vedette dans le livre « Code Beautiful ». :-) – Deestan

+3

Notez ici aussi, qu'il n'y a pas d'inversion qui se passe, et que le système est résolu directement, selon la réponse de John D. Cook. –

+0

Envisagez d'utiliser numpy [tableaux au lieu de matrices] (https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html#array-or-matrix-which-i -utilisation). Avec ['numpy.linalg'] (https://docs.scipy.org/doc/numpy/reference/routines.linalg.html), vous pouvez obtenir à peu près tout ce que vous voulez, sans utiliser le' numpy.matrix. '. – Praveen

1

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 faire vraiment besoin d'inverser la matrice.En R, par exemple, linalg.solve et la fonction solve() ne font pas réellement une inversion complète, car elle est inutile.)

+3

Jamais utilisé R, mais pourquoi un programme externe et son lieur python seraient-ils meilleurs que le paquet scientifique le plus connu de python? –

52

Assurez-vous d'avoir vraiment besoin d'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 un 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 beaucoup de valeurs b, ce n'est pas une bonne idée inverser A. Si vous devez résoudre le système pour plusieurs valeurs b, enregistrez la factorisation Cholesky de A, mais ne l'inversez pas.

Voir Don't invert that matrix.

+0

Et si mes membres matriciels sont des rationnels exacts? Il semble que cela évite le problème de précision, bien que, bien sûr, au prix d'aggraver le problème de performance. –

6

Vous pouvez calculer le déterminant de la matrice qui est récursive et former la matrice accolé

Here is a short tutorial

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

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

10

Il est regrettable que la matrice choisie, répété ici encore, est soit au singulier ou au 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 lui-même doit donner une matrice unitaire . Le A choisi dans l'explication tant vantée ne le fait pas. En fait, le simple fait de regarder l'inverse donne une idée 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 originale ...

Il est remarquable que les humains en choisissant un exemple d'une matrice réussissent si souvent à choisir un matrice singulière!

J'ai eu un problème avec la solution, donc j'ai regardé 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 suffisamment grand, disons 2, la matrice cessera vraisemblablement d'être singulière ou proche du singulier.Alors

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

devient ni singulier ni presque singulier et l'exemple donne des résultats significatifs ... Lorsque vous traitez avec des nombres flottants, il faut être vigilant pour les effets du cycle inavoidable hors des erreurs.

Merci pour votre contribution,

OldAl.

+0

on peut aussi vérifier A == AII afin de vérifier le résultat – georg

+1

Le problème est que les humains choisissent les matrices au "hasard" en entrant des progressions arithmétiques simples dans les lignes, comme 1, 2, 3 ou 11, 12, 13. Le Le problème est que si vous avez au moins trois lignes comme ceci, elles dépendent toujours linéairement. – asmeurer

5

Numpy sera adapté pour la plupart des gens, mais vous pouvez aussi faire matrices in 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)

+1

J'ai trouvé que 'numpy.linalg' donnait des résultats inexacts pour les matrices contenant de grands entiers, alors que les résultats de' sympy' sont exacts. +1 – primo

+0

Avec une précision approximative, Sympy est un bon terminal en direct. J'ai vérifié avec la commande '(M ** - 1) * M' et il a donné la matrice de l'unité (pas exactement mais très proche) –