2012-06-24 9 views
14

Tengo algunos problemas para entender las reglas para la transmisión de matrices en Numpy.Reglas de difusión de matrices numeradas

Obviamente, si realiza la multiplicación de elementos en dos matrices de las mismas dimensiones y forma, todo está bien. Además, si multiplicas una matriz multidimensional por un escalar, funciona. Esto lo entiendo

Pero si tiene dos matrices N-dimensionales de formas diferentes, no está claro para mí exactamente cuáles son las reglas de difusión. Esto documentation/tutorial explica que: Para poder emitir, el tamaño de los ejes finales para ambas matrices en una operación debe ser del mismo tamaño o uno de ellos debe ser uno.

bien, así que supongo por eje arrastrado se están refiriendo a la N en una matriz M x N. Entonces, eso significa que si intento multiplicar dos matrices en 2D (matrices) con igual cantidad de columnas, ¿debería funcionar? Excepto que no lo hace ...

>>> from numpy import * 
>>> A = array([[1,2],[3,4]]) 
>>> B = array([[2,3],[4,6],[6,9],[8,12]]) 
>>> print(A) 
[[1 2] 
[3 4]] 
>>> print(B) 
[[ 2 3] 
[ 4 6] 
[ 6 9] 
[ 8 12]] 
>>> 
>>> A * B 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

Dado que tanto A y B tienen dos columnas, yo habría pensado que esto funcionaría. Por lo tanto, probablemente estoy malinterpretando algo aquí sobre el término "eje final" y cómo se aplica a las matrices N-dimensionales.

¿Alguien puede explicar por qué mi ejemplo no funciona y qué se entiende por "eje al final"?

+1

Esta es una muy buena explicación de la transmisión, http://www.scipy.org/EricsBroadcastingDoc –

+0

¿podría agregar la etiqueta "broadcasting" por favor? – denis

+0

El enlace en el comentario de @BiRico ahora es http://wiki.scipy.org/EricsBroadcastingDoc Me pregunto por qué se movió al * archivo volcado *. – iled

Respuesta

10

Bueno, el significado de los ejes finales se explica en la página de documentación vinculada. Si tiene dos matrices con un número de dimensiones diferente, digamos uno 1x2x3 y otro 2x3, entonces solo compara las dimensiones comunes finales, en este caso 2x3. Pero si ambas matrices son bidimensionales, entonces sus tamaños correspondientes deben ser iguales o uno de ellos debe ser 1. Las dimensiones a lo largo de las cuales la matriz tiene el tamaño 1 se denominan singulares y la matriz se puede transmitir a lo largo de ellas.

En el caso de tener un 2x2 y 4x2 y 4 != 2 y tampoco 4 o igual a 21, así que esto no funciona.

+0

En otras palabras, la 'forma' de 'A' debe ser un sufijo de la 'forma' de 'B ', sin tener en cuenta ningún eje que valga 1 (?) –

+1

si al ignorar significa que' '1' es igual a cualquier cosa 'y' forma (A) 'o' forma (B) 'pueden ser sufijos uno del otro, entonces sí. – unkulunkulu

+1

en realidad, puede ver cualquier matriz como infinitamente dimensional de tamaño '... x1x1x1x1x1x1x1x ..... xAxBxC' por lo que tenemos un montón de' 1's, que pueden transmitirse como otros. De esta forma puedes olvidar ese sufijo, solo di '' 1 igual a cualquier cosa. – unkulunkulu