Dado um array numpy 3 vezes 3
a = numpy.arange(0,27,3).reshape(3,3)
# array([[ 0, 3, 6],
# [ 9, 12, 15],
# [18, 21, 24]])
Para normalizar as linhas da matriz bidimensional, pensei
row_sums = a.sum(axis=1) # array([ 9, 36, 63])
new_matrix = numpy.zeros((3,3))
for i, (row, row_sum) in enumerate(zip(a, row_sums)):
new_matrix[i,:] = row / row_sum
Deve haver uma maneira melhor, não é?
Talvez para esclarecer: por normalização, quero dizer, a soma das entradas por linha deve ser um. Mas acho que isso ficará claro para a maioria das pessoas.
Respostas:
A transmissão é muito boa para isso:
row_sums[:, numpy.newaxis]
remodela row_sums de ser(3,)
para ser(3, 1)
. Quando você faza / b
,a
eb
são transmitidos uns contra os outros.Você pode aprender mais sobre transmissão aqui ou ainda melhor aqui .
fonte
a.sum(axis=1, keepdims=True)
para manter a dimensão da coluna singleton, que você pode transmitir sem precisar usarnp.newaxis
.np.linalg.norm
vez dea.sum
!row_sums.reshape(3,1)
?O Scikit-learn tem uma função de normalização que permite aplicar várias normalizações. O "faça a soma para 1" é a norma L1, e para isso faça:
Agora, suas linhas somarão 1.
fonte
Eu acho que isso deve funcionar,
fonte
Caso você esteja tentando normalizar cada linha de forma que sua magnitude seja um (ou seja, o comprimento da unidade de uma linha é um ou a soma do quadrado de cada elemento em uma linha é um):
Verificando:
fonte
Eu acho que você pode normalizar a soma elementos de linha de 1 por este:
new_matrix = a / a.sum(axis=1, keepdims=1)
. E a normalização da coluna pode ser feita comnew_matrix = a / a.sum(axis=0, keepdims=1)
. Espero que isso possa afetar.fonte
Você pode usar a função numpy integrada:
np.linalg.norm(a, axis = 1, keepdims = True)
fonte
parece que isso também funciona
fonte
Você também pode usar a transposição de matriz:
fonte
Ou usando a função lambda, como
cada vetor de vec terá uma norma unitária.
fonte
onde input_data é o nome do seu array 2D
fonte