¿Cuáles son las diferencias entre matrices y matrices numpy? ¿Cuál debo usar?

¿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 debo atenerme a uno solo de ellos?

¿Influirá el estilo del progtwig en mi elección? Estoy haciendo algo de aprendizaje automático usando numpy, de modo que hay muchas matrices, pero también muchos vectores (matrices).

Las matrices numpy son estrictamente bidimensionales, mientras que las matrices numpy (ndarrays) son nidimensionales. 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 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 infijo con 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 de matriz como los ndarrays tienen .T para devolver la transposición, pero los objetos de matriz también tienen .H para la transposición del conjugado, y .I para la inversa.

En contraste, las matrices numpy acatan consistentemente la regla de que las operaciones se aplican de forma elemental (excepto para el nuevo operador @ ). Por lo tanto, si a y b son matrices numpy, entonces a*b es la matriz formada multiplicando los componentes de forma elemental:

 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 matriz a*a . Dado que c es un ndarray, c**2 devuelve un ndarray con cada componente en forma de elemento cuadrado.

Existen otras diferencias técnicas entre los objetos de matriz y las ndarrays (que tienen que ver con np.ravel, selección de elementos y comportamiento de secuencia).

La principal ventaja de las matrices numpy es que son más generales que las matrices bidimensionales. ¿Qué pasa cuando quieres una matriz tridimensional? Entonces tienes que usar un ndarray, no un objeto de matriz. Por lo tanto, aprender a usar objetos matriciales es más trabajo, tiene que aprender las operaciones de objetos matriciales y las operaciones ndarray.

Escribir un progtwig que use matrices y matrices hace que su vida sea difícil porque tiene que hacer 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 solo utiliza ndarrays, puede hacer todo lo que pueden hacer los objetos de la matriz, y más, excepto con funciones / notaciones ligeramente diferentes.

Si está dispuesto a renunciar al atractivo visual de la notación matricial NumPy (que se puede lograr casi con la misma elegancia con ndarrays en Python> = 3.5), 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 y np.asarray permiten convertir uno a otro (siempre que la matriz sea bidimensional).


Aquí hay una sinopsis de las diferencias entre las arrays NumPy y las arrays NumPy.

Scipy.org recomienda que uses arrays:

* ‘matriz’ o ‘matriz’? ¿Qué debo usar? – Respuesta corta

Utilizar matrices.

  • Son el tipo estándar de vector / matriz / tensor de número. Muchas matrices de retorno de función numpy, no matrices.

  • Hay 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.

La única desventaja de usar el tipo de matriz es que tendrá que usar un dot lugar de * para multiplicar (reducir) dos tensores (producto escalar, multiplicación de vectores de matriz, etc.).

Solo para agregar un caso a la lista de Unutbu.

Una de las mayores diferencias prácticas para mí de las ndarrays numpy en comparación con las matrices numpy o los lenguajes de matriz como matlab, es que la dimensión no se conserva en las 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

 >>> m = np.mat([[1,2],[2,3]]) >>> m matrix([[1, 2], [2, 3]]) >>> mm = m.mean(1) >>> mm matrix([[ 1.5], [ 2.5]]) >>> mm.shape (2, 1) >>> m - mm matrix([[-0.5, 0.5], [-0.5, 0.5]]) 

con matriz

 >>> a = np.array([[1,2],[2,3]]) >>> a array([[1, 2], [2, 3]]) >>> am = a.mean(1) >>> am.shape (2,) >>> am array([ 1.5, 2.5]) >>> a - am #wrong array([[-0.5, -0.5], [ 0.5, 0.5]]) >>> a - am[:, np.newaxis] #right array([[-0.5, 0.5], [-0.5, 0.5]]) 

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.

Como han mencionado otros, tal vez la principal ventaja de la matrix fue que proporcionó una notación conveniente para la multiplicación de matrices.

Sin embargo, en Python 3.5 hay finalmente un operador de infijo dedicado para la multiplicación de matrices : @ .

Con las versiones recientes de NumPy, se puede usar con ndarray s:

 A = numpy.ones((1, 3)) B = numpy.ones((3, 3)) A @ B 

Así que hoy en día, aún más, en caso de duda, debe atenerse a ndarray .