web-dev-qa-db-fra.com

Inverse d'une matrice utilisant numpy

J'aimerais utiliser numpy pour calculer l'inverse. Mais je reçois une erreur:

'numpy.ndarry' object has no attribute I

Pour calculer l'inverse d'une matrice en numpy, disons la matrice M, il faut simplement: print M.I

Voici le code:

x = numpy.empty((3,3), dtype=int)
for comb in combinations_with_replacement(range(10), 9):
   x.flat[:] = comb
   print x.I

Je présume que cette erreur se produit car x est maintenant plat. La commande 'I' n'est donc pas compatible. Y at-il un travail autour de cela?

Mon objectif est d’imprimer la matrice inverse de toutes les combinaisons possibles de matrices numériques.

45
Jake Z

L'attribut I n'existe que sur les objets matrix, pas ndarrays. Vous pouvez utiliser numpy.linalg.inv pour inverser des tableaux:

inverse = numpy.linalg.inv(x)

Notez que dans la façon dont vous générez des matrices, toutes ne seront pas inversibles. Vous devrez soit changer la façon dont vous générez les matrices, soit ignorer celles qui ne sont pas inversibles.

try:
    inverse = numpy.linalg.inv(x)
except numpy.linalg.LinAlgError:
    # Not invertible. Skip this one.
    pass
else:
    # continue with what you were doing

De même, si vous souhaitez parcourir toutes les matrices 3x3 avec des éléments tirés de [0, 10), vous souhaitez ce qui suit:

for comb in itertools.product(range(10), repeat=9):

plutôt que combinations_with_replacement, ou vous sauterez des matrices comme

numpy.array([[0, 1, 0],
             [0, 0, 0],
             [0, 0, 0]])
57
user2357112

Une autre façon de faire consiste à utiliser numpy matrix class (plutôt qu'un tableau numpy) et l'attribut I. Par exemple:

>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5,  1.5],
       [ 2. , -1. ]])
11
dagrha

Inverse d'une matrice avec python et numpy:

>>> import numpy as np
>>> b = np.array([[2,3],[4,5]])
>>> np.linalg.inv(b)
array([[-2.5,  1.5],
       [ 2. , -1. ]])

Toutes les matrices ne peuvent pas être inversées. Par exemple les matrices singulières ne sont pas inversables :

>>> import numpy as np
>>> b = np.array([[2,3],[4,6]])
>>> np.linalg.inv(b)

LinAlgError: Singular matrix

Solution au problème de la matrice singulière:

essayez d’attraper l’exception Singular Matrix et continuez jusqu’à ce que vous trouviez une transformation qui répond à vos critères précédents ET est également inversable.

Intuition pour laquelle l'inversion de matrice ne peut pas toujours être faite; comme dans les matrices singulières:

Imaginez un vieux rétroprojecteur projetant une lumière vive à travers un film sur un mur blanc. Les pixels du film sont projetés sur les pixels du mur.

Si j'arrête la projection du film sur une seule image, vous verrez les pixels du film sur le mur et je vous demande de régénérer le film en fonction de ce que vous voyez. C'est facile, dites-vous, prenez simplement l'inverse de la matrice qui a effectué la projection. Un inverse d'une matrice est l'inversion de la projection.

Maintenant, imaginez si le projecteur était corrompu et que je mettais un objectif déformé devant le film. Maintenant, plusieurs pixels sont projetés au même endroit sur le mur. Je vous ai de nouveau demandé "d'annuler cette opération avec l'inverse de la matrice". Vous dites: "Je ne peux pas parce que vous avez détruit des informations avec la distorsion de l'objectif, je ne peux pas revenir à l'endroit où nous étions, car la matrice est singulière ou dégénérée."

Une matrice qui peut être utilisée pour transformer certaines données en d'autres données n'est inversible que si le processus peut être inversé sans perte d'information. Si votre matrice ne peut pas être inversée, vous définissez peut-être votre projection à l'aide d'une méthodologie d'estimation et de contrôle plutôt que d'un processus garantissant une transformation non corrompue.

Si vous utilisez une précision heuristique ou autre que mathématique, vous devrez définir un autre processus pour gérer et mettre en quarantaine les distorsions afin que la programmation par mouvement brownien puisse reprendre.

La source:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv

8
Eric Leschinski

Qu'en est-il de inv ?

exemple: my_inverse_array = inv (my_array)

2
user1330052