복붙노트

[PYTHON] numpy는 행 합계로 행을 나눕니다.

PYTHON

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]])

해결법

  1. ==============================

    1.방법 # 1 : None (또는 np.newaxis)을 사용하여 브로드 캐스트가 작동하도록 추가 차원을 추가합니다.

    방법 # 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 : go transpose-happy :

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

    (원한다면, 간결성을 위해 축 = 부분을 삭제할 수 있습니다.)

    방법 # 3 : (하이메의 의견에서 승격 됨)

    sum에 keepdims 인수를 사용하여 차원을 유지합니다.

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

    2.당신은 수학적으로 그것을 할 수 있습니다.

    당신은 수학적으로 그것을 할 수 있습니다.

    여기에서 E는 원래의 행렬이고 D는 각 행렬이 E의 해당 행의 합인 대각 행렬입니다. 행운을 빌어 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)
    
  3. from https://stackoverflow.com/questions/16202348/numpy-divide-row-by-row-sum by cc-by-sa and MIT license