¿Cuáles son las diferencias entre matrices y matrices numerosas? ¿Cuál debería usar?

Resuelto levesque asked hace 13 años • 7 respuestas

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

levesque avatar Nov 11 '10 10:11 levesque
Aceptado

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*bes 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 .Tque devolver la transpuesta, pero los objetos matriciales también la tienen .Hpara la transpuesta conjugada y .Ipara 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 ay bson matrices numerosas, entonces a*bla 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 aes una matriz, a**2devuelve el producto de la matriz a*a. Dado que ces un ndarray, c**2devuelve 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.ravella 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.asmatrixle np.asarraypermite convertir uno en el otro (siempre que la matriz sea bidimensional).


Hay una sinopsis de las diferencias entre NumPy yarrays NumPy matrixaquí .

unutbu avatar Nov 11 '2010 03:11 unutbu

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

Lee avatar Mar 14 '2013 10:03 Lee

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.

Aks avatar Apr 11 '2020 11:04 Aks