Normalizar columnas de matriz numpy en python


Tengo una matriz numpy donde cada celda de una fila específica representa un valor para una entidad. Los almaceno todos en una matriz de 100*4.

A     B   C
1000  10  0.5
765   5   0.35
800   7   0.09  

Cualquier idea de cómo puedo normalizar filas de este numpy.array donde cada valor está entre 0 y 1?

Mi salida deseada es:

A     B    C
1     1    1
0.765 0.5  0.7
0.8   0.7  0.18(which is 0.09/0.5)

Gracias de antemano:)

Author: ahajib, 2015-04-16

2 answers

Si entiendo correctamente, lo que desea hacer es dividir por el valor máximo en cada columna. Puedes hacer esto fácilmente usando broadcasting.

Comenzando con su matriz de ejemplo:

import numpy as np

x = np.array([[1000,  10,   0.5],
              [ 765,   5,  0.35],
              [ 800,   7,  0.09]])

x_normed = x / x.max(axis=0)

print(x_normed)
# [[ 1.     1.     1.   ]
#  [ 0.765  0.5    0.7  ]
#  [ 0.8    0.7    0.18 ]]

x.max(0) toma el máximo sobre la 0a dimensión (es decir, filas). Esto le da un vector de tamaño (ncols,) que contiene el valor máximo en cada columna. A continuación, puede dividir x por este vector con el fin de normalizar sus valores de tal manera que el valor máximo en cada columna se escalará a 1.


Si x contiene valores negativos, primero tendría que restar el mínimo:

x_normed = (x - x.min(0)) / x.ptp(0)

Aquí, x.ptp(0) devuelve el "pico a pico" (es decir, el rango, max-min) a lo largo del eje 0. Esta normalización también garantiza que el valor mínimo en cada columna será 0.

 67
Author: ali_m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-29 22:51:48

Puede usar sklearn.preprocesamiento:

from sklearn.preprocessing import normalize
data = np.array([
    [1000, 10, 0.5],
    [765, 5, 0.35],
    [800, 7, 0.09], ])
data = normalize(data, axis=0, norm='max')
print(data)
>>[[ 1.     1.     1.   ]
[ 0.765  0.5    0.7  ]
[ 0.8    0.7    0.18 ]]
 10
Author: Marcin Mrugas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-30 08:45:20