tutorial - sumar columnas de una matriz python
¿Cuáles son las diferencias entre matrices y matrices numpy? ¿Cuál debo usar? (4)
¿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, ¿debería molestarme en usar ambos o debo atenerme a uno solo?
¿Influirá el estilo del programa en mi elección? Estoy haciendo algo de aprendizaje automático usando numpy, por lo que hay muchas matrices, pero también muchos vectores (matrices).
Como han mencionado otros, quizás 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
.
Las matrices numpy son estrictamente bidimensionales, mientras que las matrices numpy (ndarrays) son ndimensionales. 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 mediante 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 los objetos de la matriz es más trabajo: hay que aprender las operaciones de los objetos de la matriz y las operaciones de ndarray.
Escribir un programa 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 usa 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.
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.
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 numpy. 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.).