Normalización mínimo-máximo de una matriz NumPy

Tengo la siguiente matriz numpy:

foo = np.array([[0.0, 10.0], [0.13216, 12.11837], [0.25379, 42.05027], [0.30874, 13.11784]]) 

cuyos rendimientos:

 [[ 0. 10. ] [ 0.13216 12.11837] [ 0.25379 42.05027] [ 0.30874 13.11784]] 

¿Cómo puedo normalizar el componente Y de esta matriz? Así que me da algo como:

 [[ 0. 0. ] [ 0.13216 0.06 ] [ 0.25379 1 ] [ 0.30874 0.097]] 

Refiriéndose a este enlace de validación cruzada, ¿Cómo normalizar los datos a un rango de 0-1? , parece que puedes realizar la normalización mín.-máx. en la última columna de foo .

 v = foo[:, 1] # foo[:, -1] for the last column foo[:, 1] = (v - v.min()) / (v.max() - v.min()) 

 foo array([[ 0. , 0. ], [ 0.13216 , 0.06609523], [ 0.25379 , 1. ], [ 0.30874 , 0.09727968]]) 

Otra opción para realizar la normalización (como lo sugiere OP) es usar sklearn.preprocessing.normalize , que produce resultados ligeramente diferentes:

 from sklearn.preprocessing import normalize foo[:, [-1]] = normalize(foo[:, -1, None], norm='max', axis=0) 

 foo array([[ 0. , 0.2378106 ], [ 0.13216 , 0.28818769], [ 0.25379 , 1. ], [ 0.30874 , 0.31195614]]) 

Creo que quieres esto:

 foo[:,1] = (foo[:,1] - foo[:,1].min()) / (foo[:,1].max() - foo[:,1].min()) 

También se puede usar sklearn.preprocessing.MinMaxScaler ( feature_range=(0, 1) es el predeterminado):

 from sklearn import preprocessing min_max_scaler = preprocessing.MinMaxScaler() v = foo[:,1] v_scaled = min_max_scaler.fit_transform(v) foo[:,1] = v_scaled print(foo) 

Salida:

 [[ 0. 0. ] [ 0.13216 0.06609523] [ 0.25379 1. ] [ 0.30874 0.09727968]] 

La ventaja es que se puede hacer escala a cualquier rango.

Está intentando escalar de mínimo a máximo entre 0 y 1 solo la segunda columna.

El uso de sklearn.preprocessing.minmax_scale debería resolver fácilmente su problema.

p.ej:

 from sklearn.preprocessing import minmax_scale column_1 = foo[:,0] #first column you don't want to scale column_2 = minmax_scale(foo[:,1], feature_range=(0,1)) #second column you want to scale foo_norm = np.stack((column_1, column_2), axis=1) #stack both columns to get a 2d array 

Debe ceder

 array([[0. , 0. ], [0.13216 , 0.06609523], [0.25379 , 1. ], [0.30874 , 0.09727968]]) 

Tal vez quieras escalar mínimo-máximo entre 0 y 1 ambas columnas. En este caso, utilice:

 foo_norm = minmax_scale(foo, feature_range=(0,1), axis=0) 

Cuyos rendimientos

 array([[0. , 0. ], [0.42806245, 0.06609523], [0.82201853, 1. ], [1. , 0.09727968]]) 

nota : personalmente no llamaría a la operación que está intentando realizar la normalización . La normalización se refiere más comúnmente a la operación que estandariza la norma (longitud) de un vector a un cierto valor (generalmente 1), no su rango de valores.