108 votes

Comment normaliser un tableau numpy à 2 dimensions en python moins verbeux?

Étant donné un tableau numpy 3 fois 3

 a = numpy.arange(0,27,3).reshape(3,3)

# array([[ 0,  3,  6],
#        [ 9, 12, 15],
#        [18, 21, 24]])

Pour normaliser les lignes du tableau à 2 dimensions auquel j'ai pensé

 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

Il doit y avoir un meilleur moyen, n'est-ce pas ?

Peut-être pour clarifier : par normalisation, je veux dire, la somme des entrées par ligne doit être égale à un. Mais je pense que ce sera clair pour la plupart des gens.

130voto

rogueleaderr Points 439

Scikit-learn propose une fonction normalize() qui permet d'appliquer diverses normalisations. Le "faire la somme à 1" est appelé L1-norm. Par conséquent:

 from sklearn.preprocessing import normalize

matrix = numpy.arange(0,27,3).reshape(3,3).astype(numpy.float64)
# array([[  0.,   3.,   6.],
#        [  9.,  12.,  15.],
#        [ 18.,  21.,  24.]])

normed_matrix = normalize(matrix, axis=1, norm='l1')
# [[ 0.          0.33333333  0.66666667]
#  [ 0.25        0.33333333  0.41666667]
#  [ 0.28571429  0.33333333  0.38095238]]

Maintenant, vos lignes totaliseront 1.

11voto

tom10 Points 19886

Je pense que cela devrait fonctionner,

 a = numpy.arange(0,27.,3).reshape(3,3)

a /=  a.sum(axis=1)[:,numpy.newaxis]

6voto

walt Points 1

Si vous essayez de normaliser chaque ligne de telle sorte que sa magnitude soit de un (c'est-à-dire que la longueur unitaire d'une ligne est de un ou que la somme du carré de chaque élément d'une ligne est de un) :

 import numpy as np

a = np.arange(0,27,3).reshape(3,3)

result = a / np.linalg.norm(a, axis=-1)[:, np.newaxis]
# array([[ 0.        ,  0.4472136 ,  0.89442719],
#        [ 0.42426407,  0.56568542,  0.70710678],
#        [ 0.49153915,  0.57346234,  0.65538554]])

Vérification :

 np.sum( result**2, axis=-1 )
# array([ 1.,  1.,  1.]) 

4voto

Snoopy Points 96

Je pense que vous pouvez normaliser la somme des éléments de ligne à 1 par ceci: new_matrix = a / a.sum(axis=1, keepdims=1) . Et la normalisation des colonnes peut être effectuée avec new_matrix = a / a.sum(axis=0, keepdims=1) . J'espère que cela peut aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X