numpy podziel wiersz po wierszu suma

Jak mogę podzielić wiersz tablicy numpy przez sumę wszystkich wartości w tym wierszu?

To jeden z przykładów. Ale jestem pewien, że jest jakiś wymyślny i znacznie skuteczniejszy sposób na zrobienie tego:
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])

Wynik:

array([[ 0.        ,  1.        ],
       [ 0.33333333,  0.66666667],
       [ 0.16666667,  0.83333333]])
Author: SailAvid, 2013-04-25

2 answers

Metoda #1: Użyj None (lub np.newaxis), Aby dodać dodatkowy wymiar, aby nadawanie zachowało się:

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

Metoda # 2: go transpose-happy:

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

(możesz porzucić axis= część dla zwięzłości, jeśli chcesz.)

Metoda # 3: (promowana z komentarza Jaime'a)

Użyj argumentu keepdims na sum, aby zachować wymiar:

>>> e/e.sum(axis=1, keepdims=True)
array([[ 0.        ,  1.        ],
       [ 0.33333333,  0.66666667],
       [ 0.16666667,  0.83333333]])
 69
Author: DSM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-14 17:21:40

Można to zrobić matematycznie jako Tutaj wpisz opis obrazka.

Tutaj E jest macierzą oryginalną i {[2] } jest macierzą diagonalną, gdzie każdy wpis jest sumą odpowiadającego mu wiersza w E. Jeśli masz szczęście, że masz odwracalny D, jest to dość matematycznie wygodny sposób na robienie rzeczy.

W 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)
 5
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 16:38:32