2009-08-29 20 views
10

tengo una temperatura pitón ndarray en algún código que estoy leyendo que sufre esto: (. Es decir, equivalente a m * m)¿Qué significa matriz ** 2 en python/numpy?

x = temp**2 

¿Es esta la plaza de puntos o la plaza matriz (es decir, m debe ser una matriz cuadrada)? En particular, me gustaría saber si puedo deshacerse de la transpuesta en este código:

temp = num.transpose(whatever) 
num.sum(temp**2,axis=1)) 

y convertirlo en esto:

num.sum(whatever**2,axis=0) 

que me va a ahorrar al menos 0,1 ms, y claramente vale mi tiempo.
Gracias! ¡El operador ** es indestructible y no sé nada! a

Respuesta

12

Es solo el cuadrado de cada elemento.

from numpy import * 
a = arange(4).reshape((2,2)) 
print a**2 

impresiones

[[0 1] 
[4 9]] 
+1

Woot, gracias. Fifteeeeenherewecome. –

+1

De nada. (Firmé nuevamente para señalar la nota probablemente obvia, que si tu ndarray tiene> 2 dimensiones, no creo que funcione la transposición, el intercambio de ejes). – tom10

+1

Puedo ver dónde esto puede ser confuso. Sin conocer Python, y entendiendo que para los números reales (y complejos) la cuadratura significa "multiplicar un número por sí mismo", hubiera sido razonable suponer que significaba "multiplicar una matriz por sí mismo" para las matrículas. Esto significa que la matriz tiene el mismo número de filas y columnas, por supuesto. – duffymo

4

** es el operador a subir al poder en Python, por lo x**2 significa "x al cuadrado" en Python - incluyendo numpy. Tales operaciones en numpy siempre aplican elemento por elemento, por lo que x**2 cuadra cada elemento de la matriz x (cualquier número de dimensiones) igual que, por ejemplo, x*2 duplicaría cada elemento, o x+2 incrementaría cada elemento por dos (en cada caso, x propiamente dicho no se ve afectado, el resultado es una nueva matriz temporal de la misma forma que x!).

Editar: @ kaizer.ze como señala, mientras que lo que he escrito es válido para numpy.array objetos, que no se aplica a numpy.matrix objetos, donde la multiplicación significa la multiplicación de matrices en lugar de elemento por elemento de operación como por array (y de manera similar para elevar al poder) - de hecho, esa es la diferencia clave entre los dos tipos. A medida que el Scipy tutorial pone, por ejemplo:

Cuando usamos numpy.array o numpy.matrix hay una diferencia. A * x será en este último caso el producto matriz , no el producto elemento como con matriz.

es decir, como el numpy reference pone:

Una matriz es una matriz especializada 2-d que conserva su naturaleza 2-d a través de operaciones. Tiene ciertos operadores especiales , como * (multiplicación de la matriz ) y ** (potencia de la matriz).

+1

Bueno, lamentablemente no es tan simple, como respondí; los diferentes comportamientos de 'array' y' matrix' pueden confundir esto, y operadores como '*' y '**' ¡cambian el significado! (Si A * B es una multiplicación de matriz con matriz A, B, A ** 2 tiene que ser la exponenciación de la matriz, por supuesto.) – u0b34a0f6ae

+0

Sí, hay una diferencia entre la matriz y la matriz, aunque '**' por supuesto sigue siendo el aumento a la operación de potencia, las operaciones en una matriz se aplican a "la matriz", en una matriz a "los elementos". Buen punto, déjame editar para aclarar. –

5

Debe leer NumPy for Matlab Users. Aquí se menciona la operación de potencia con elementos, y también se puede ver que en numpy, algunos operadores aplican de manera diferente a array y matrix.

>>> from numpy import * 
>>> a = arange(4).reshape((2,2)) 
>>> print a**2 
[[0 1] 
[4 9]] 
>>> print matrix(a)**2 
[[ 2 3] 
[ 6 11]]