2009-08-29 9 views
10

J'ai un temp ndarray python dans un code que je lis qui souffre ceci: (.-À-dire, ce qui équivaut à m * m)Que signifie matrice ** 2 en python/numpy?

x = temp**2 

Est-ce la place du point ou la place de la matrice (c.-à-m doit être une matrice carrée)? En particulier, je voudrais savoir si je peux me débarrasser de la transposition dans ce code:

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

et la transformer en ceci:

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

qui me sauver au moins 0.1ms, et vaut clairement mon temps.
Merci! L'opérateur ** est indiscutable et je ne sais rien! a

Répondre

12

C'est juste le carré de chaque élément.

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

impressions

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

Woot, merci. Fifteeeeenherewecome. –

+1

De rien. (Je me suis réinscrit dans la note probablement évidente, que si vous êtes ndarray sont> 2 dimensions, je ne pense pas que la transposition, l'échange d'axe fonctionnera.) – tom10

+1

Je peux voir où cela pourrait être déroutant. Sans connaître Python, et en comprenant que pour les nombres réels (et complexes), équerrer signifie «multiplier un nombre par lui-même», il aurait été raisonnable de supposer qu'il signifiait «multiplier une matrice par lui-même» pour les matrices. Cela signifie que la matrice a un nombre égal de lignes et de colonnes, bien sûr. – duffymo

4

** est l'opérateur raise à pouvoir en Python, x**2 signifie "x au carré" en Python - y compris numpy. Ces opérations en numpy appliquent toujours élément par élément, donc x**2 place chaque élément du tableau x (quel que soit le nombre de dimensions) comme, par exemple, x*2 doublerait chaque élément, ou x+2 augmenterait chaque élément de deux (dans chaque cas, n'est pas affecté - le résultat est un nouveau tableau temporaire de la même forme que x!).

Modifier: comme @ kaizer.ze souligne, tout ce que je l'ai écrit pour numpy.array détient des objets, il ne concerne pas les objets numpy.matrix, où la multiplication signifie la multiplication de matrices plutôt que l'élément par élément de fonctionnement comme pour array (et de même pour élever au pouvoir) - en effet, c'est la principale différence entre les deux types. Comme le Scipy tutorial met, par exemple:

Lorsque nous utilisons numpy.array ou numpy.matrix il y a une différence. A * x sera dans le dernier cas matrice produit, pas élémentaire produit comme avec tableau.

à-dire que le numpy reference met:

Une matrice est une matrice 2-D spécialisé qui conserve sa nature 2-d par opérations. Il a certains opérateurs spéciaux , tels que * (multiplication matricielle ) et ** (puissance matricielle).

+1

Eh bien, ce n'est malheureusement pas si simple que j'ai répondu; les comportements différents de 'array' et' matrix' peuvent le confondre, et les opérateurs tels que '*' et '**' changent de sens! (Si A * B est une multiplication matricielle avec matrice A, B, A ** 2 doit bien sûr être une exponentiation matricielle.) – u0b34a0f6ae

+0

Oui, il y a une différence entre matrix et array - bien que '**' soit toujours l'augmentation Opération de puissance, les opérations sur une matrice s'appliquent à "la matrice", sur un tableau à "les éléments". Bon point, laissez-moi éditer pour clarifier. –

5

Vous devriez lire NumPy for Matlab Users. L'opération d'alimentation par éléments est mentionnée ici, et vous pouvez également voir qu'en numpy, certains opérateurs s'appliquent différemment à array et 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]]