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