¿Cuales son las ventajas y desventajas de cada uno?
Por lo que he visto, cualquiera de los dos puede funcionar como un reemplazo para el otro si es necesario, así que ¿debería molestarme en usar ambos o debería limitarme a uno solo?
¿El estilo del programa influirá en mi elección? Estoy haciendo un aprendizaje automático usando numpy, por lo que hay muchas matrices, pero también muchos vectores (matrices).

A @ Blugar deA.dot(B), whereAyBson 2Dndarrays. Esto elimina la ventaja principal de usar enmatrixlugar de simplesndarray, en mi humilde opinión.Respuestas:
Según los documentos oficiales, ya no es aconsejable usar la clase de matriz, ya que se eliminará en el futuro.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
Como otras respuestas ya indican que puede lograr todas las operaciones con matrices NumPy.
fuente
Las matrices Numpy son estrictamente bidimensionales, mientras que las matrices numpy (ndarrays) son N-dimensionales. Los objetos de matriz son una subclase de ndarray, por lo que heredan todos los atributos y métodos de ndarrays.
La principal ventaja de las matrices numpy es que proporcionan una notación conveniente para la multiplicación de matrices: si ayb son matrices, entonces
a*bes su producto matricial.Por otro lado, a partir de Python 3.5, NumPy admite la multiplicación de matriz infija usando el
@operador, por lo que puede lograr la misma conveniencia de la multiplicación de matriz con ndarrays en Python> = 3.5.Tanto los objetos de matriz como los ndarrays tienen
.Tque devolver la transposición, pero los objetos de matriz también tienen.Hpara la transposición conjugada y.Ipara la inversa.Por el contrario, los arreglos numpy cumplen de manera consistente con la regla de que las operaciones se aplican por elementos (excepto para el nuevo
@operador). Por lo tanto, siaybson matrices numpy, entoncesa*bla matriz se forma multiplicando los componentes por elementos:Para obtener el resultado de la multiplicación de matrices, use
np.dot(o@en Python> = 3.5, como se muestra arriba):El
**operador también se comporta de manera diferente:Como
aes una matriz,a**2devuelve el producto de la matriza*a. Comoces un ndarray,c**2devuelve un ndarray con cada componente al cuadrado en cuanto a elementos.Existen otras diferencias técnicas entre los objetos de matriz y los ndarrays (que tienen que ver con la
np.ravelselección de elementos y el comportamiento de la secuencia).La principal ventaja de las matrices numpy es que son más generales que las matrices bidimensionales . ¿Qué sucede cuando quieres una matriz tridimensional? Luego debe usar un ndarray, no un objeto de matriz. Por lo tanto, aprender a usar objetos matriciales es más trabajo: hay que aprender las operaciones de objetos matriciales y las operaciones ndarray.
Escribir un programa que mezcle matrices y matrices te dificulta la vida porque tienes que hacer un seguimiento de qué tipo de objeto son tus variables, para que la multiplicación no devuelva algo que no esperas.
Por el contrario, si se limita únicamente a los ndarrays, puede hacer todo lo que pueden hacer los objetos matriciales, y más, excepto con funciones / notación ligeramente diferentes.
Si está dispuesto a renunciar al atractivo visual de la notación de productos de matriz NumPy (que se puede lograr de manera casi tan elegante con ndarrays en Python> = 3.5), entonces creo que los arreglos NumPy son definitivamente el camino a seguir.
PD. Por supuesto, usted realmente no tiene que elegir uno a expensas del otro, desde
np.asmatrixynp.asarraypermitirá convertir una a la otra (siempre y cuando la matriz es de 2 dimensiones).Hay una sinopsis de las diferencias entre NumPy
arraysvs NumPymatrixes aquí .fuente
mat**nporque una matriz se puede aplicar de manera poco elegante a una matriz conreduce(np.dot, [arr]*n)np.linalg.matrix_power(mat, n)np.dot(array2, array2)son más rápidas quematrix1*matrix2. Esto tiene sentido porquematrixes una subclase de ndarray que anula métodos especiales como__mul__.matrix.__mul__llamadasnp.dot. Así que hay reutilización de código aquí. En lugar de realizar menos comprobaciones, el usomatrix*matrixrequiere una llamada de función adicional. Entonces, la ventaja de usarmatrixes puramente sintáctica, no un mejor rendimiento.Scipy.org recomienda que use matrices:
fuente
ndarray. El argumento principal para usarmatrixsería si su código es pesado en álgebra lineal y se vería menos claro con todas las llamadas a ladotfunción. Pero este argumento desaparecerá en el futuro, ahora que el operador @ es aceptado para su uso con la multiplicación de matrices, ver PEP 465 . Esto necesitará Python 3.5 y la última versión de Numpy. La clase de matriz podría quedar obsoleta en el futuro lejano, por lo que es mejor usar ndarray para el nuevo código ...scipy.sparsematrices. Si usa matrices densas y dispersas en su código, es mucho más fácil seguirlasmatrix.Solo para agregar un caso a la lista de unutbu.
Una de las mayores diferencias prácticas para mí de ndarrays numpy en comparación con matrices numpy o lenguajes matriciales como matlab, es que la dimensión no se conserva en operaciones de reducción. Las matrices son siempre 2d, mientras que la media de una matriz, por ejemplo, tiene una dimensión menos.
Por ejemplo, degradar filas de una matriz o matriz:
con matriz
con matriz
También creo que mezclar matrices y matrices da lugar a muchas horas de depuración "felices". Sin embargo, las matrices scipy.sparse son siempre matrices en términos de operadores como la multiplicación.
fuente
Como otros han mencionado, quizás la principal ventaja de esto
matrixera que proporcionaba una notación conveniente para la multiplicación de matrices.Sin embargo, en Python 3.5 por fin hay un operador infijo dedicado para la multiplicación de matrices :
@.Con versiones recientes de NumPy, se puede usar con
ndarrays:Así que hoy en día, aún más, cuando tengas dudas, debes seguir
ndarray.fuente