2015-10-19 4 views
0

Je voudrais normaliser les lignes de la matrice par leur moyenne et j'ai écrit ce code pour qu'illignes de la matrice Normaliser NumPy par leur moyenne

m = np.matrix(
    [[1,2,3,4,5], 
    [2,3,2,5,3], 
    [5,5,5,3,2]]) 

for row in m[:,]: 
    average = row.sum()/row.shape[1] 
    row = row/average 

Dans pour le cycle, je divise la ligne en moyenne. Mais cette division ne change pas la matrice m. Comment puis-je réaliser cette normalisation de la manière la plus simple et la plus intelligente?

Répondre

6

Calculer la ligne sage moyenne, et le calcul m/average:

In [36]: average = m.mean(axis=1) 

In [37]: average 
Out[37]: 
matrix([[ 3.], 
     [ 3.], 
     [ 4.]]) 

In [38]: m/average 
Out[38]: 
matrix([[ 0.33333333, 0.66666667, 1.  , 1.33333333, 1.66666667], 
     [ 0.66666667, 1.  , 0.66666667, 1.66666667, 1.  ], 
     [ 1.25  , 1.25  , 1.25  , 0.75  , 0.5  ]]) 

Notez que si votre matrice contient NaN valeurs, alors vous pouvez utiliser np.nanmean(m, axis=1) au lieu de m.mean(axis=1) pour calculer la ligne sage signifie tout en ignorant NaN .

+0

Et 'm/= m.mean (axis = 1) 'pour modifier' m', mais vu que dtype 'm' est' int', ils finiront par ints plutôt que par floats. –

1

Pour in-situ changement m, vous pouvez convertir en float type de données (si pas déjà), puis utiliser np.divide, comme si -

m = m.astype(float) 
np.divide(m,m.mean(1),m) 

run Exemple -

In [294]: m 
Out[294]: 
matrix([[1, 2, 3, 4, 5], 
     [2, 3, 2, 5, 3], 
     [5, 5, 5, 3, 2]]) 

In [295]: m = m.astype(float) 

In [296]: np.divide(m,m.mean(1),m); 

In [297]: m 
Out[297]: 
matrix([[ 0.33333333, 0.66666667, 1.  , 1.33333333, 1.66666667], 
     [ 0.66666667, 1.  , 0.66666667, 1.66666667, 1.  ], 
     [ 1.25  , 1.25  , 1.25  , 0.75  , 0.5  ]])