¿Cuáles son las diferencias entre matrices y matrices numerosas? ¿Cuál debería usar?
¿Cuales son las ventajas y desventajas de cada uno?
Por lo que he visto, cualquiera de los dos puede funcionar como reemplazo del otro si es necesario, entonces, ¿debería molestarme en usar ambos o debería limitarme a uno solo de ellos?
¿El estilo del programa influirá en mi elección? Estoy haciendo algo de aprendizaje automático usando numpy, por lo que de hecho hay muchas matrices, pero también muchos vectores (matrices).
Las matrices numpy son estrictamente bidimensionales, mientras que las matrices numpy (ndarrays) son N-dimensionales. Los objetos Matrix 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 a y b son matrices, entonces a*b
es su producto matricial.
import numpy as np
a = np.mat('4 3; 2 1')
b = np.mat('1 2; 3 4')
print(a)
# [[4 3]
# [2 1]]
print(b)
# [[1 2]
# [3 4]]
print(a*b)
# [[13 20]
# [ 5 8]]
Por otro lado, a partir de Python 3.5, NumPy admite la multiplicación de matrices infijas usando el @
operador, por lo que puede lograr la misma conveniencia de la multiplicación de matrices con ndarrays en Python >= 3.5.
import numpy as np
a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
# [ 5 8]]
Tanto los objetos matriciales como los ndarrays tienen .T
que devolver la transpuesta, pero los objetos matriciales también la tienen .H
para la transpuesta conjugada y .I
para la inversa.
Por el contrario, las matrices numpy cumplen consistentemente la regla de que las operaciones se aplican por elementos (excepto el nuevo @
operador). Por lo tanto, si a
y b
son matrices numerosas, entonces a*b
la matriz se forma multiplicando los componentes por elementos:
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Para obtener el resultado de la multiplicación de matrices, usa np.dot
(o @
en Python >= 3.5, como se muestra arriba):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
El **
operador también se comporta de manera diferente:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Como a
es una matriz, a**2
devuelve el producto de la matriz a*a
. Dado que c
es un ndarray, c**2
devuelve un ndarray con cada componente al cuadrado por elementos.
Existen otras diferencias técnicas entre los objetos matriciales y los ndarrays (que tienen que ver con np.ravel
la 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? Entonces tienes que usar un ndarray, no un objeto de matriz. Por lo tanto, aprender a usar objetos matriciales requiere más trabajo: debe aprender las operaciones de objetos matriciales y las operaciones ndarray.
Escribir un programa que combine matrices y arreglos le dificulta la vida porque debe realizar un seguimiento de qué tipo de objeto son sus variables, para que la multiplicación no devuelva algo que no espera.
Por el contrario, si te quedas únicamente con ndarrays, entonces puedes 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 producto matricial NumPy (que se puede lograr casi con la misma elegancia con ndarrays en Python >= 3.5), entonces creo que las matrices NumPy son definitivamente el camino a seguir.
PD. Por supuesto, realmente no tiene que elegir uno a expensas del otro, ya que np.asmatrix
le np.asarray
permite convertir uno en el otro (siempre que la matriz sea bidimensional).
Hay una sinopsis de las diferencias entre NumPy yarrays
NumPy matrix
aquí .
Scipy.org recomienda utilizar matrices:
* ¿ 'matriz' o 'matriz'? ¿Cuál debo usar? - Respuesta corta
Utilice matrices.
- Admiten álgebra de matrices multidimensionales compatible con MATLAB
- Son el tipo de vector/matriz/tensor estándar de NumPy. Muchas funciones de NumPy devuelven matrices, no matrices.
- Existe una clara distinción entre operaciones de elementos y operaciones de álgebra lineal.
- Puede tener vectores estándar o vectores de fila/columna si lo desea.
Hasta Python 3.5, la única desventaja de usar el tipo de matriz era que había que usarlo
dot
en lugar de*
multiplicar (reducir) dos tensores (producto escalar, multiplicación de vectores de matrices, etc.). Desde Python 3.5 puedes usar el@
operador de multiplicación de matrices.Teniendo en cuenta lo anterior, tenemos la intención de dejarlo en desuso
matrix
eventualmente.
Según los documentos oficiales, ya no es recomendable utilizar la clase matriz ya que se eliminará en el futuro.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
Como ya indican otras respuestas, puede lograr todas las operaciones con matrices NumPy.