¿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 @ B
lugar deA.dot(B)
, whereA
yB
son 2Dndarray
s. Esto elimina la ventaja principal de usar enmatrix
lugar 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*b
es 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
.T
que devolver la transposición, pero los objetos de matriz también tienen.H
para la transposición conjugada y.I
para 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, sia
yb
son matrices numpy, entoncesa*b
la 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
a
es una matriz,a**2
devuelve el producto de la matriza*a
. Comoc
es un ndarray,c**2
devuelve 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.ravel
selecció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.asmatrix
ynp.asarray
permitirá convertir una a la otra (siempre y cuando la matriz es de 2 dimensiones).Hay una sinopsis de las diferencias entre NumPy
arrays
vs NumPymatrix
es aquí .fuente
mat**n
porque 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 porquematrix
es 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*matrix
requiere una llamada de función adicional. Entonces, la ventaja de usarmatrix
es puramente sintáctica, no un mejor rendimiento.Scipy.org recomienda que use matrices:
fuente
ndarray
. El argumento principal para usarmatrix
sería si su código es pesado en álgebra lineal y se vería menos claro con todas las llamadas a ladot
funció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.sparse
matrices. 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
matrix
era 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
ndarray
s:Así que hoy en día, aún más, cuando tengas dudas, debes seguir
ndarray
.fuente