2009-08-29 9 views
10

Ho una temperatura pitone ndarray in qualche codice che sto leggendo che soffre questo: (. Cioè, pari a m * m)Che cosa significa matrice ** 2 in python/numpy?

x = temp**2 

È questo il quadrato punto o la matrice quadrata (cioè m deve essere una matrice quadrata)? In particolare, mi piacerebbe sapere se posso sbarazzarsi della trasposizione in questo codice:

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

e trasformarlo in questo:

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

Questo mi farà risparmiare almeno 0,1 ms, e chiaramente vale la pena il mio tempo.
Grazie! L'operatore ** è ungooglable e non so nulla! a

risposta

12

È solo il quadrato di ogni elemento.

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

stampe

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

Woot, grazie. Fifteeeeenherewecome. –

+1

Prego. (Ho firmato nuovamente la nota probabilmente ovvia, che se tu sei narray sono> 2 dimensioni, non penso che la trasposizione, la cosa che scambia gli assi funzionerà.) – tom10

+1

Posso vedere dove questo potrebbe essere fonte di confusione. Senza conoscere Python e comprendendo che per i numeri reali (e complessi) quadrare significa "moltiplicare un numero di per sé", sarebbe stato ragionevole presumere che significasse "moltiplicare una matrice da sola" per le matrici. Ciò significa che la matrice ha lo stesso numero di righe e colonne, ovviamente. – duffymo

4

** è il rilancio-potenza operatore in Python, così x**2 significa "x ^" in Python - compreso NumPy. Tali operazioni in numpy si applicano sempre elemento per elemento, quindi x**2 piazze ogni elemento dell'array x (qualsiasi numero di dimensioni) come, ad esempio, x*2 raddoppierà ogni elemento oppure x+2 incrementerebbe ogni elemento di due (in ogni caso, x corretto non è influenzato: il risultato è un nuovo array temporaneo con la stessa forma di x!).

Edit: come @ kaizer.ze sottolinea, mentre ciò che ho scritto vale per numpy.array oggetti, non si applica ai numpy.matrix oggetti, dove moltiplicazione significa moltiplicazione matrice anziché elemento dall'operazione elemento come ad array (e allo stesso modo per alzare al potere) - in effetti, questa è la differenza chiave tra i due tipi. Come il Scipy tutorial lo mette, ad esempio:

Quando usiamo numpy.array o numpy.matrix c'è una differenza. A * x sarà nel secondo caso matrice prodotto, non elementare prodotto come con array.

cioè, come numpy reference mette:

Una matrice è un specializzato 2-d matrice che conserva il suo 2-d natura attraverso operazioni. Ha alcuni operatori speciali , come * (moltiplicazione matrix ) e ** (alimentazione matrice).

+1

Beh, purtroppo non è così semplice, come ho risposto; i diversi comportamenti di 'array' e' matrix' possono confondere questo, e operatori come '*' e '**' cambiano significato! (Se A * B è la moltiplicazione della matrice con A, B matrix, A ** 2 deve essere la matrice di elevazione del corso.) – u0b34a0f6ae

+0

Sì, c'è una differenza tra matrice e matrice - anche se '**' è ovviamente ancora l'aumento -alimentazione a potenza, le operazioni su una matrice si applicano a "la matrice", su una matrice a "gli elementi". Buon punto, fammi modificare per chiarire. –

5

È necessario leggere NumPy for Matlab Users. Qui viene menzionata l'operazione di alimentazione elementwise, e puoi anche vedere che in numpy alcuni operatori si applicano in modo diverso a array e 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]]