2013-04-24 4 views
26

numpy 배열 행을이 행의 모든 ​​값의 합으로 나눌 수있는 방법은 무엇입니까?numpy 행 단위로 행 나누기

이것은 하나의 예입니다. 그러나 나는이 일을 멋진 훨씬 더 효율적인 방법이 확신 해요 :

import numpy as np 
e = np.array([[0., 1.],[2., 4.],[1., 5.]]) 
for row in xrange(e.shape[0]): 
    e[row] /= np.sum(e[row]) 

결과 :

array([[ 0.  , 1.  ], 
     [ 0.33333333, 0.66666667], 
     [ 0.16666667, 0.83333333]]) 

답변

53

방법 # 1 : None (또는 np.newaxis)가 여분의 차원을 추가하는 데 사용 그래서 방송이 작동합니다 :

>>> e 
array([[ 0., 1.], 
     [ 2., 4.], 
     [ 1., 5.]]) 
>>> e/e.sum(axis=1)[:,None] 
array([[ 0.  , 1.  ], 
     [ 0.33333333, 0.66666667], 
     [ 0.16666667, 0.83333333]]) 

방법 # 2 : 이동 트랜스 - 행복 :

>>> (e.T/e.sum(axis=1)).T 
array([[ 0.  , 1.  ], 
     [ 0.33333333, 0.66666667], 
     [ 0.16666667, 0.83333333]]) 

은 (당신이 원하는 경우, 간결의 axis= 부분을 삭제할 수 있습니다.)

방법 # 3 :

:

사용 sumkeepdims 인수는 치수를 유지하기 위해 (제이미의 코멘트에서 승진)

>>> e/e.sum(axis=1, keepdims=True) 
array([[ 0.  , 1.  ], 
     [ 0.33333333, 0.66666667], 
     [ 0.16666667, 0.83333333]]) 
+0

난 당신이'축 = 1'을 삭제하는 방법을 볼 수 없습니다. 'axis' 인수가 없으면'sum()'은 배열의 모든 값의 합을 반환합니다. –

+18

numpy 1.7에는'e/e.sum (축 = 1, keepdims = True)'을 할 수있는'keepdims' 인수가 있습니다. – Jaime

+2

@WarrenWeckesser :'1' 부분을 삭제할 수 있다고 말하지 않았습니다. 'axis ='부분을 삭제할 수 있다고 말했다. – DSM

5

수학적으로는 enter image description here과 같이 할 수 있습니다.

여기에서 E은 원래 행렬이고 D은 대각 행렬이며 각 항목은 E에있는 해당 행의 합계입니다. 당신이 충분히 invertible D을 가지고 운이 좋다면, 이것은 수학적으로 편리한 방법입니다. NumPy와에서

:

import numpy as np 

diagonal_entries = [sum(e[row]) for row in range(e.shape[0])] 
D = np.diag(diagonal_entries) 
D_inv = np.linalg.inv(D) 
e = np.dot(e, D_inv)