2009-08-29 4 views
10

Mam temp pyton ndarray w niektórych kodu Czytam, że cierpi na tym: (tzn., Co odpowiada m * m)Co oznacza macierz ** 2 w python/numpy?

x = temp**2 

Jest to kwadrat kropka lub macierzą kwadratową (czyli m musi być kwadratowa matryca)? W szczególności chciałbym wiedzieć, czy mogę pozbyć się transpozycji tego kodu:

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

i przekształcić go w ten sposób:

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

Będzie mi zaoszczędzić co najmniej 0,1 ms i jest zdecydowanie warta mojego czasu.
Dzięki! Operator ** jest niewykonalny i nic nie wiem! a

Odpowiedz

12

To tylko kwadrat każdego elementu.

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

drukuje

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

Woot, dzięki. Fifteeeeenherewecome. –

+1

Nie ma za co. (Podpisałem się ponownie, aby wskazać prawdopodobnie oczywistą uwagę, że jeśli jesteś ndarray są> 2 wymiary, nie sądzę, aby transpozycja, rzecz wymiany osi zadziałała.) – tom10

+1

Widzę, gdzie to może być mylące. Nie znając Pythona i nie rozumiejąc, że dla prawdziwych (i złożonych) liczb, kwadrowanie oznacza "pomnażanie liczby przez siebie", rozsądnie byłoby założyć, że oznaczało to "mnożenie samej matrycy" dla matriks. Oznacza to, że macierz ma oczywiście równą liczbę rzędów i kolumn. – duffymo

4

** jest operatorem podbicie do władzy w Pythonie, więc x**2 oznacza "x kwadrat" w Pythonie - tym numpy. Takie operacje w numpy zawsze stosują element po elemencie, więc każdy element tablicy (niezależnie od liczby wymiarów), taki jak, powiedzmy, x*2 podwoiłby każdy element, lub x+2 zwiększyłby każdy element o dwa (w każdym przypadku, x prawidłowy jest niezmieniony - wynikiem jest nowa tymczasowa tablica o tym samym kształcie, co x!).

Edit: jako @ kaizer.ze zwraca uwagę, podczas gdy to, co napisałem odnosi się do numpy.array obiektów, to nie stosuje się do obiektów, gdzie numpy.matrix oznacza mnożenie macierzy mnożenia zamiast elementu przez działanie elementu podobnego do array (i podobnie jak w przypadku podniesienia do władzy) - rzeczywiście, jest to kluczowa różnica między tymi dwoma typami. Jak Scipy tutorial kładzie to na przykład:

Gdy używamy numpy.array lub numpy.matrix istnieje różnica. A * x będzie w tym ostatnim przypadku macierzy produkt, a nie elementowo produkt jako z tablicą.

to jest gdy numpy reference mówi:

macierz jest wyspecjalizowanym 2-d Tablica który zachowuje swój charakter 2-d przez operacji. Ma pewne specjalne operatory , takie jak * (mnożenie macierzy ) i ** (moc matrycy).

+1

Cóż, niestety nie jest to tak proste, jak odpowiedziałem; różne zachowania 'tablic' i' macierzy' mogą mylić to, a operatory takie jak '*' i '**' zmieniają znaczenie! (Jeśli A * B jest mnożeniem macierzy w macierzy A, B, A ** 2 musi być oczywiście potęgowaniem macierzy.) – u0b34a0f6ae

+0

Tak, istnieje różnica między macierzą a tablicą - chociaż '**' to oczywiście wciąż przebicie do działania na moc, operacje na macierzy odnoszą się do "macierzy", w tablicy do "elementów". Dobra uwaga, pozwól mi edytować, aby wyjaśnić. –

5

Powinieneś przeczytać NumPy for Matlab Users. W tym miejscu wymieniona jest elementowa operacja zasilania, a można również zauważyć, że w numpy niektórzy operatorzy stosują różne metody w stosunku do array i 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]]