una tutorial transpuesta sumar multiplicar matriz matrices libreria elementos ejemplos columnas array agregar python arrays matrix numpy

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



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