2012-11-25 1 views
3

나는 MATLAB에서 Numpy로 전환하면서 성장 통증을 느끼고 있습니다.3 차원 어레이의 평면에 넘치는 합계, 스칼라 반환

저는 3 차원 배열을 가지고 있다고 말하면 3x3x3이고 각 평면의 스칼라 합이 필요합니다. MATLAB에서 , 내가 사용합니다 :

sum_vec = sum(3dArray,3); 

TIA 세계 은행

편집 : 내 MATLAB 코드에 대해 잘못이었다. Matlab은 희미하게 만 벡터화되므로 루프가 필요합니다. 그래서 numpy는 더 우아한 것으로 밝혀진다. .. 시원한.

MATLAB 
for i = 1:3 
    sum_vec(i) = sum(sum(3dArray(:,:,i)); 
end 

답변

3

당신은 np.sumaxis 키워드를 사용해야합니다. 다른 많은 numpy 함수와 마찬가지로 axis을 사용하면 특정 축을 따라 작업을 수행 할 수 있습니다.

import numpy as np 
sum_vec = np.sum(3dArray, axis=-1) 

을 그리고 당신은 모든 배열 조각에 마지막 차원에 따라 합계에 해당하는 결과 2 차원 배열을 얻을 것이다 : 당신은 배열의 마지막 차원에 따라 합계를 예를 들어, 당신은 할 것 3dArray[i, k, :].

UPDATE

내가 당신이 원하는 정확히 이해하지 못했다. 당신은 2 차원 (평면)을 합산하려고합니다. 이 경우 두 개의 합계를 사용할 수 있습니다. 예를 들어, 첫 번째 두 가지 차원에 걸쳐 합산 :

sum_vec = np.sum(np.sum(3dArray, axis=0), axis=0) 
+0

응답 해 주셔서 감사합니다. 나는 더 분명 할 필요가있다. 3dArray의 각 평면에 대해 스칼라 벡터를 원합니다. 여기서 각 스칼라는 전체 평면의 합계입니다. 그러므로 3x3x3 배열의 경우 sum_vec = ([43, 123, 455]) – wbg

+0

@wbg가되므로 합계를 두 번하고 싶습니다 (matlab 코드에서도 그렇게하지는 않습니다).새로운 numpy에서는'array.sum ((1,2))'도 수행 할 수 있으며, 두 축을 직접 합쳐서 한번에 합칠 수 있습니다. – seberg

+0

예, 맞습니다 ...! 그건 슬픈, 내가 잠시 동안 정기적으로 파이썬을 해왔 던데, matlab은 단지 하나의 희미하게 벡터화하는 것을 잊었다. 그래서 3d 배열은 반복되어야한다. – wbg

7

당신이 할 수있는

sum_vec = np.array([plane.sum() for plane in cube]) 

또는 cube이 3 차원 배열을 단순히

sum_vec = cube.sum(-1).sum(-1) 

. 플레인의 방향에 따라 -1 (또는 2) 대신 0 또는 1을 지정할 수 있습니다. 후자의 버전은 파이썬 루프를 사용하지 않기 때문에 더 좋으며 보통 numpy을 사용할 때 성능을 향상시키는 데 도움이됩니다.

+0

그게 전부예요. 전 완전히 matlab 모드에 있습니다 .... 짧은 명령이 있다고 가정했지만, 당신의 스 니펫은 꽤 직관적입니다. 모두 감사합니다. – wbg

+0

@wbg seberg는 "numpy"의 새로운 버전에서 더 짧은 명령을 사용할 수 있다고 언급합니다. –

0

대신 두 번 같은 합계 함수를 적용하는 경우에는 재 형성된 어레이의 합을 수행 할 수있다 : 번만 합계 때문에

a = np.random.rand(10, 10, 10) # 3D array 
b = a.view() 
b.shape = (a.shape[0], -1) 
c = np.sum(b, axis=1) 

위 빠를 것이다.