Python Inverso de una Matriz


¿Cómo obtengo la inversa de una matriz en python? Lo he implementado yo mismo, pero es Python puro, y sospecho que hay módulos más rápidos para hacerlo.

Author: Amro, 2008-10-17

6 answers

Deberías echar un vistazo a numpy si haces manipulación de matrices. Este es un módulo escrito principalmente en C, que será mucho más rápido que la programación en python puro. Aquí hay un ejemplo de cómo invertir una matriz, y hacer otra manipulación de la matriz.

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.

También puede echar un vistazo al módulo array, que es una implementación mucho más eficiente de listas cuando tiene que lidiar con un solo tipo de datos.

 100
Author: Mapad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 12:07:43

Asegúrese de que realmente necesita invertir la matriz. Esto a menudo es innecesario y puede ser numéricamente inestable. Cuando la mayoría de la gente pregunta cómo invertir una matriz, realmente quieren saber cómo resolver Ax = b donde A es una matriz y x y b son vectores. Es más eficiente y más preciso usar código que resuelve la ecuación Ax = b para x directamente que calcular una inversa y luego multiplicar la inversa por B. Incluso si necesita resolver Ax = b para muchos valores de b, no es una buena idea invertir A. Si tiene que resolver el sistema para múltiples valores b, guarde la factorización Cholesky de A, pero no la invierta.

Véase No invierta esa matriz.

 52
Author: John D. Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-16 19:59:46

Es una pena que la matriz elegida, repetida aquí de nuevo, sea singular o esté mal condicionada:

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

Por definición, el inverso de A cuando se multiplica por la matriz A debe dar una matriz unitaria. El elegido en la muy alabada explicación no hace eso. De hecho, solo mirando el inverso da una pista de que la inversión no funcionó correctamente. Mira la magnitud de los términos individuales-son muy, muy grandes en comparación con los términos de la A original matriz...

Es notable que los humanos al elegir un ejemplo de una matriz tan a menudo logran elegir una matriz singular!

Tuve un problema con la solución, así que investigué más a fondo. En la plataforma ubuntu-kubuntu, el paquete debian numpy no tiene la matriz y los subpaquetes linalg, así que además de importar numpy, scipy también necesita ser importado.

Si los términos diagonales de A se multiplican por un factor suficientemente grande, digamos 2, la matriz lo más probable es que deje de ser singular o casi singular. So

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

No se vuelve ni singular ni casi singular y el ejemplo da resultados significativos... Cuando se trata de números flotantes, uno debe estar atento a los efectos de los errores de redondeo inavoidables.

Gracias por su contribución,

OldAl.

 10
Author: user377367,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-27 21:19:14

Se podría calcular el determinante de la matriz que es recursiva y luego formar la matriz contigua

Aquí hay un breve tutorial

Creo que esto solo funciona para matrices cuadradas

Otra forma de calcular esto implica la ortogonalización de gram-schmidt y luego la transposición de la matriz, la transposición de una matriz ortogonalizada es su inversa!

 6
Author: dbr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-12 09:54:22

Numpy será adecuado para la mayoría de las personas, pero también puede hacer matrices en Sympy

Intente ejecutar estos comandos en http://live.sympy.org /

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

Por diversión, intenta M**(1/2)

 5
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-17 13:02:36

Si odias a numpy, saca RPy y tu copia local de R, y úsala en su lugar.

(También haría eco para que realmente necesite invertir la matriz. En R, por ejemplo, linalg.solve y la función solve() en realidad no hacen una inversión completa, ya que es innecesaria.)

 1
Author: Gregg Lind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-16 17:19:22