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.
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 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.
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
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, si a
y b
son matrices numpy, 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, use 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
. Como c
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
y np.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 NumPy matrix
es aquí .