2010-11-11 17 views
245

¿Cuáles son las ventajas y desventajas de cada uno?¿Cuáles son las diferencias entre matrices y matrices numpy? ¿Cuál debería usar?

Por lo que he visto, cualquiera puede funcionar como un reemplazo para el otro si fuera necesario, entonces ¿debería molestarme en usar ambos o debería apegarme a solo uno de ellos?

¿El estilo del programa influirá en mi elección? Estoy haciendo algo de aprendizaje automático usando numpy, así que de hecho hay muchas matrices, pero también muchos vectores (matrices).

+2

No tengo suficiente información para justificar una respuesta, pero por lo que puedo decir, la principal diferencia es la implementación de la multiplicación. Una matriz realiza una multiplicación de matriz/tensor, mientras que una matriz hará una multiplicación de elementos. –

+2

Python 3.5 agregó el operador infijo @ para la multiplicación de matrices (PEP 465) y NumPy 1.10 agregó soporte para ello. Entonces, si está usando Python 3.5+ y NumPy 1.10+, puede simplemente escribir 'A @ B' en lugar de' A.dot (B) ', donde' A' y 'B' son 2D' ndarray's. Esto elimina la principal ventaja de usar 'matriz' en lugar de simplemente' ndarray's, en mi humilde opinión. – MiniQuark

Respuesta

283

Las matrices numpy son estrictamente bidimensionales, mientras que las matrices numpy (ndarrays) son N-dimensional. Los objetos de matriz son una subclase de ndarray, por lo que heredan todos los 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 matriz .

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 apoya infija multiplicación de matrices usando el operador @, por lo que puede lograr la misma comodidad 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([email protected]) 
# [[13 20] 
# [ 5 8]] 

Ambos objetos de matriz y ndarrays tener .T para volver la transpuesta, pero la matriz objetos también tienen .H para la transpuesta conjugada, y .I para la inversa.

En contraste, las matrices numpy cumplen consistentemente con la regla de que las operaciones son aplicadas en cuanto a los elementos (excepto para el nuevo operador @). Por lo tanto, si a y b son matrices numpy, entonces a*b es la matriz formado por la multiplicación de los componentes de elemento a elemento:

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, se utiliza np.dot (o @ en Python> = 3,5, como se muestra más 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]] 

Dado que 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 al cuadrado elemento-sabio.

Existen otras diferencias técnicas entre los objetos de matriz y 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é sucede cuando quieres una matriz tridimensional? Luego, , tiene que usar un ndarray, no un objeto de matriz.Por lo tanto, aprender a usar los objetos de la matriz es más trabajo; debe aprender operaciones de objetos de matriz y operaciones de ndarray.

Escribir un programa que utiliza ambas matrices y matrices hace la vida difícil porque hay que llevar un registro de qué tipo de objeto sus variables son, no sea algo retorno de multiplicación que no esperas.

Por el contrario, si se adhiere únicamente a ndarrays, entonces puede hacer todo lo que objetos de matriz pueden hacer, y más, excepto con funciones/notación ligeramente diferentes .

Si está dispuesto a renunciar al atractivo visual de la notación del producto NumPy matrix (que se puede lograr casi tan elegantemente con ndarrays en Python> = 3.5), entonces creo que las matrices NumPy son definitivamente el camino a seguir.

PS. Por supuesto, realmente no tiene que elegir una a expensas de la otra, ya que np.asmatrix y np.asarray le permiten convertir una a la otra (como siempre que la matriz sea bidimensional).


No es una sinopsis de las diferencias entre NumPy arrays vs NumPy matrix es here.

+5

Para aquellos que se preguntan, 'mat ** n' para una matriz se puede aplicar de forma poco elegante a una matriz con' reduce (np.dot, [arr] * n) ' – askewchan

+2

o simplemente' np.linalg.matrix_power (mat, n) ' – Eric

+0

Me pregunto si las matrices serían más rápidas ... pensarías que tienen que realizar menos comprobaciones que ndarray. – PascalVKooten

23

Solo para agregar una caja a la lista de unutbu.

Una de las mayores diferencias prácticas para mí de ndarrays numpy en comparación con matrices numpy o 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 pienso que las matrices y matrices de mezcla da lugar a muchos "feliz "horas de depuración". Sin embargo, las matrices scipy.sparse son siempre matrices en términos de operadores como la multiplicación.

69

Scipy.org recommends that you use arrays:

* 'array' o 'matriz'? ¿Qué debería usar? - Respuesta corta

Usar matrices.

  • Son el tipo estándar vector/matriz/tensor de numpy. Muchas funciones numpy devuelven matrices, no matrices.

  • Hay una clara distinción entre las operaciones de elementos y las 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 uso dot en lugar de * para multiplicar (reducir) dos tensores (producto escalar, matriz vector multiplicación etc.).

+6

Aunque la respuesta aceptada proporciona más información, la verdadera respuesta es seguir con 'ndarray'. El argumento principal para usar 'matrix' sería si su código es pesado en álgebra lineal y se vería menos claro con todas las llamadas a la función' dot'. Pero este argumento desaparecerá en el futuro, ahora que se acepta el @operador para su uso con la multiplicación de matrices, ver [PEP 465] (https://www.python.org/dev/peps/pep-0465/). Esto necesitará Python 3.5 y la última versión de Numpy. La clase de la matriz podría estar en desuso en un futuro lejano, así que es mejor usar ndarray para el nuevo código ... –

+4

Esa página olvida graciosamente las matrices 'scipy.sparse'. Si usa matrices densas y dispersas en su código, es mucho más fácil adherirse a 'matriz'. –

+1

En mi opinión, la principal desventaja de las matrices es que la división de columnas devuelve matrices planas que pueden ser confusas y matemáticamente no son realmente correctas. Esto también conduce a la desventaja importante de que las matrices numpy no se pueden tratar de la misma manera que las matrices scipy.sparse mientras que las matrices numpy básicamente se pueden intercambiar libremente con matrices dispersas. Algo absurdo en este contexto que scipy recomienda el uso de matrices y luego no proporciona matrices dispersas compatibles. –

13

Como han mencionado otros, quizás la principal ventaja de matrix fue que proporcionaba una notación conveniente para la multiplicación de matrices.

Sin embargo, in Python 3.5 there is finally a dedicated infix operator for matrix multiplication: @.

Con los recientes versiones NumPy, que se puede utilizar 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, usted debe pegarse a ndarray.

Cuestiones relacionadas