2009-08-29 2 views
10

내가 그것을 읽고 있어요 일부 코드에서 파이썬 ndarray 온도가이 고통 : (. m에 즉, 해당 * m)python/numpy에서 행렬 ** 2의 의미는 무엇입니까?

x = temp**2 

이이 점 광장 아니면 매트릭스 광장 (즉, m가되어야합니다 정사각형 행렬)?

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

을이로 돌려 : 특히, 나는이 코드에 전치 제거 할 수 있는지 알고 싶습니다 적어도는 0.1ms 날을 절약 할 수

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

, 그리고 분명 내 시간의 가치가있다.
감사합니다. ** 연산자는 거치지 않으며 나는 아무것도 모른다! a

답변

12

각 요소의 사각형입니다. NumPy와 포함 -

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

인쇄

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

Woot, thanks. 그로부터 15 분. –

+1

반갑습니다. (ndarray가 2 차원보다 큰 경우, transposing, axis swapping이 작동한다고 생각하지 않는다는 사실을 다시 지적했다.) – tom10

+1

이것이 어디에서 혼란 스러울 지 알 수있다. 파이썬을 알지 못하고, 실제 (그리고 복잡한) 숫자 제곱은 "그 자체로 숫자를 곱하는 것"을 의미한다는 것을 이해한다면 그것이 "매트릭스 자체를 매트릭스에 곱하는 것"을 의미한다고 가정하는 것이 타당합니다. 이것은 행렬이 같은 수의 행과 열을 가진다는 것을 의미합니다. – duffymo

4

** 정도로 x**2 파이썬 "X 제곱"이란, 파이썬 인상 대 전력 연산자이다. 이러한 numpy 작업은 항상 요소 단위로 적용되므로 x**2은 배열 x (각 차원 수에 상관없이)의 각 요소를 각 요소를 두 배로 늘릴 것과 같이 x*2을 각 단위로 두거나 각 요소를 두 개씩 늘립니다 (각각 x proper 영향을받지 않습니다. 결과는 x과 같은 모양의 새로운 임시 배열입니다!).

편집 : @ kaizer.ze가 지적으로 numpy.array 객체에 대해 내가 쓴 무엇을 보유하는 동안, 그것은 곱셈 array에 대한 같은 요소 조작으로 행렬 곱셈이 아닌 요소를 의미 numpy.matrix 개체에 적용 (그리고하지 않습니다 마찬가지로 권력을 키우기 위해) - 실제로 두 가지 유형의 주요 차이점이 있습니다. Scipy tutorial는 예를 들어, 말했듯이 :

우리가 numpy.array 또는 numpy.matrix을 사용할 때 차이가 있습니다. A * x는 후자의 경우 매트릭스 입니다. 요소형 제품이 아니고 배열은 입니다.

numpy reference이 말하듯 :

행렬 연산을 통해 2 차원 특성을 보유하는 특화된 2-D 어레이 이다. * (행렬 곱셈) 및 ** (행렬 지수)과 같은 특정 특수 문자 을 가지고 있습니다.

+1

나는 슬프게도 그렇게 간단하지 않다. 'array'와'matrix'의 다른 동작은 이것을 혼란스럽게 할 수 있고,'*'와'**' 같은 연산자는 의미를 바꿉니다! (A * B가 A, B 행렬 인 경우 행렬 곱셈이면 A ** 2는 당연히 행렬 지수가되어야합니다.) – u0b34a0f6ae

+0

예, 행렬과 배열 사이에는 차이가 있습니다. 물론 '**'는 여전히 인상입니다 - 전원 작업, 행렬에 대한 연산은 "요소"에 대한 배열의 "행렬"에 적용됩니다. 좋은 지적, 명확히하기 위해 편집하겠습니다. –

5

NumPy for Matlab Users을 읽어야합니다. elementwise power 연산이 여기에 언급되어 있으며 numpy에서 어떤 연산자는 arraymatrix에 다르게 적용된다는 것을 볼 수 있습니다.

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