Los documentos numpy recomiendan usar una matriz en lugar de una matriz para trabajar con matrices. Sin embargo, a diferencia de la octava (que estaba usando hasta hace poco), * no realiza la multiplicación de matrices, debe usar la función matrixmultipy (). Siento que esto hace que el código sea muy ilegible.
¿Alguien comparte mis puntos de vista y ha encontrado una solución?
.*
sintaxis vs '*' para la multiplicación de elementos versus matriz. Si tuviera eso, entonces todo sería más simple, aunque me sorprende que elijan*
significar en cuanto a elementos y no multiplicación de matrices.Respuestas:
La razón principal para evitar usar el
matrix
clase es que a) es inherentemente bidimensional, yb) hay una sobrecarga adicional en comparación con una matriz numpy "normal". Si todo lo que está haciendo es álgebra lineal, entonces, por supuesto, siéntase libre de usar la clase de matriz ... Sin embargo, personalmente me parece más problemático de lo que vale.Para matrices (anteriores a Python 3.5), use en
dot
lugar dematrixmultiply
.P.ej
O en versiones más recientes de numpy, simplemente use
x.dot(y)
Personalmente, me parece mucho más legible que el
*
operador que implica la multiplicación de matrices ...Para matrices en Python 3.5, use
x @ y
.fuente
x.T.dot(A.T).dot(A).dot(x)
no es tan ilegible, aunque para cada uno lo suyo. Si principalmente estás haciendo una multiplicación matricial, entonces, ¡por supuesto, úsalanumpy.matrix
!numpy.matrixmultiply
es difícil de escribir.numpy.dot
equivalente a la multiplicación de matrices. Si realmente no te gusta la notación, usa lamatrix
clase.Las cosas clave que debe saber para operaciones en matrices NumPy versus operaciones en matrices NumPy son:
La matriz NumPy es una subclase de la matriz NumPy
Las operaciones de matriz NumPy son por elementos (una vez que se contabiliza la transmisión)
Las operaciones de matriz NumPy siguen las reglas ordinarias de álgebra lineal
Algunos fragmentos de código para ilustrar:
pero esta operación falla si estas dos matrices NumPy se convierten en matrices:
aunque el uso de la sintaxis NP.dot funciona con matrices ; Estas operaciones funcionan como la multiplicación de matrices:
Entonces, ¿alguna vez necesitas una matriz NumPy? es decir, ¿será suficiente una matriz NumPy para el cálculo de álgebra lineal (siempre que conozca la sintaxis correcta, es decir, NP.dot)?
la regla parece ser que si los argumentos (matrices) tienen formas (mxn) compatibles con una operación de álgebra lineal dada, entonces está bien, de lo contrario, arroja NumPy.
La única excepción que he encontrado (probablemente haya otras) es calcular la matriz inversa .
a continuación hay fragmentos en los que he llamado una operación de álgebra lineal pura (de hecho, desde el módulo de Álgebra Lineal de Numpy) y pasé en una matriz NumPy
determinante de una matriz:
vectores propios / pares de valores propios :
norma de la matriz :
factorización qr :
rango de la matriz :
condición de la matriz :
Sin embargo, la inversión requiere una matriz NumPy:
pero el pseudoinverso de Moore-Penrose parece funcionar bien
fuente
En 3.5, Python finalmente obtuvo un operador de multiplicación de matrices . La sintaxis es la siguiente
a @ b
.fuente
Existe una situación en la que el operador de puntos dará diferentes respuestas al tratar con matrices como con las matrices. Por ejemplo, suponga lo siguiente:
Vamos a convertirlos en matrices:
Ahora, podemos ver una salida diferente para los dos casos:
fuente
Referencia de http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html
..., se desaconseja el uso de la clase numpy.matrix , ya que no agrega nada que no se pueda lograr con los objetos 2D numpy.ndarray , y puede dar lugar a una confusión sobre qué clase se está utilizando. Por ejemplo,
Las operaciones scipy.linalg se pueden aplicar igualmente a numpy.matrix o a objetos 2D numpy.ndarray .
fuente
Este truco podría ser lo que estás buscando. Es una especie de simple sobrecarga del operador.
Luego puede usar algo como la clase Infix sugerida como esta:
fuente
Una cita pertinente de PEP 465: un operador infijo dedicado para la multiplicación de matrices , como lo menciona @ petr-viktorin, aclara el problema al que se enfrentaba el OP:
La introducción del
@
operador infijo debería ayudar a unificar y simplificar el código de la matriz de Python.fuente
La función matmul (desde numpy 1.10.1) funciona bien para ambos tipos y devuelve el resultado como una clase de matriz numpy:
Salida:
Desde python 3.5 como se mencionó anteriormente , también puede usar un nuevo operador de multiplicación de matrices
@
comoy obtenga el mismo resultado que el anterior.
fuente