Pregunta

¿Cómo obtengo el inverso 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.

¿Fue útil?

Solución

Debería echar un vistazo a numpy si realiza la manipulación de la matriz. 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 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 consultar el módulo array , que es un una implementación mucho más eficiente de las listas cuando tiene que tratar con un solo tipo de datos.

Otros consejos

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 las personas preguntan cómo invertir una matriz, realmente quieren saber cómo resolver Ax = b donde A es una matriz yx y b son vectores. Es más eficiente y más preciso usar un código que resuelva la ecuación Ax = b para x directamente que calcular A inversa y luego multiplicar la inversa por B. Incluso si necesita resolver Ax = b para muchos valores de b, no es una buena idea para invertir A. Si tiene que resolver el sistema para múltiples valores b, guarde la factorización Cholesky de A, pero no la invierta.

Ver No invierta esa matriz .

Es una pena que la matriz elegida, repetida aquí nuevamente, 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 misma debe dar una matriz unitaria. El elegido en la muy elogiada explicación no hace eso. De hecho, solo mirar el inverso da una pista de que la inversión no funcionó correctamente. Observe la magnitud de los términos individuales: son muy, muy grandes en comparación con los términos de la matriz A original ...

¡Es notable que los humanos al elegir un ejemplo de una matriz a menudo se las arreglan para elegir una matriz singular!

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

Si los términos diagonales de A se multiplican por un factor suficientemente grande, digamos 2, la matriz probablemente dejará de ser singular o casi singular. Así que

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

no se convierte en 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 errores de redondeo inevitables.

Gracias por tu contribución,

OldAl.

Podrías calcular el determinante de la matriz que es recursiva y luego formar la matriz adjunta

Aquí hay un breve tutorial

Creo que esto solo funciona para matrices cuadradas

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

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, intente M**(1/2)

Si odias los números, sal de RPy y tu copia local de R, y utilízalos en su lugar.

(También me gustaría hacer un eco para hacer que realmente necesite invertir la matriz. En R, por ejemplo, linalg.solve y la función solve () no hacen una inversión completa, ya que no es necesario.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top