2008-10-17 25 views
55

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

+0

puede usted por favor mostrar su algoritmo? –

+0

hay respuesta aquí, si alguien quiere un fragmento de código https://stackoverflow.com/questions/32114054/matrix-inversion-without-numpy – Alex

Respuesta

99

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 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. 

Puede también tener una mirada en el módulo array, que es una aplicación mucho más eficiente de las listas cuando se tiene que tratar con un solo tipo de datos.

+0

numpy también aparece en el libro "Código hermoso". :-) – Deestan

+3

Observe también aquí que no hay inversión y que el sistema se resuelve directamente, según la respuesta de John D. Cook. –

+0

Considere usar numpy [matrices en lugar de matrices] (https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i -utilizar). Junto con ['numpy.linalg'] (https://docs.scipy.org/doc/numpy/reference/routines.linalg.html), puede obtener casi todo lo que desee, sin utilizar el' 'numpy.matrix '' difícil de manejar. '. – Praveen

1

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

(También me gustaría hacerte pensar que realmente necesitas invertir la matriz. En R, por ejemplo, linalg.solve y la función solve() no hacen una inversión completa, ya que no es necesaria).

+3

Nunca usé R, pero ¿por qué un programa externo y su carpeta de Python serían mejores que el paquete científico más conocido de Python? –

52

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 yx 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 para calcular A inverso y luego multiplicar lo inverso por B. Incluso si necesita resolver Ax = b para muchos valores b, no es una buena idea para invertir A. Si tiene que resolver el sistema para múltiples valores b, guarde la factorización de Cholesky de A, pero no la invierta.

Ver Don't invert that matrix.

+0

¿Qué pasa si los miembros de mi matriz son racionales exactos? Parece que eso evita el problema de precisión, aunque, por supuesto, a costa de empeorar el problema de rendimiento. –

6

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

Here is a short tutorial

creo que esto sólo funciona para matrices cuadradas

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

10

es una lástima que la matriz elegida, que se repite aquí otra vez, es o bien singular o mal acondicionado:

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

Por definición, la inversa de A cuando se multiplica por la propia matriz A debe dar una matriz unidad . La A elegida en la explicación tan alabada no hace eso. De hecho, el simple hecho de observar lo inverso da una pista de que la inversión no funcionó correctamente. Observe la magnitud de los términos individuales: son muy, muy grandes comparados con los términos de la matriz A original ...

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

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

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

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

convierte ni singular ni casi singular y el ejemplo da resultados significativos ... Cuando se trata de los números flotantes hay que estar atentos a los efectos de la ronda inavoidable de errores.

Gracias por su contribución,

OldAl.

+0

uno también puede verificar A == AII para verificar el resultado – georg

+1

El problema es que los humanos eligen las matrices al "azar" ingresando progresiones aritméticas simples en las filas, como 1, 2, 3 o 11, 12, 13. El problema es que si tiene al menos tres filas como esta, siempre son linealmente dependientes. – asmeurer

5

Numpy será adecuado para la mayoría de la gente, pero también se puede hacer matrices in Sympy

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

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

Para la diversión, tratar M**(1/2)

+1

Encontré que 'numpy.linalg' daba resultados inexactos para matrices que contenían enteros grandes, mientras que los resultados de' sympy' son exactos. +1 – primo

+0

Con una precisión aproximada, Sympy es una terminal buena y en vivo. Lo comprobé con el comando '(M ** - 1) * M' y le di la matriz de la unidad (no exactamente pero muy cerca) –