2015-04-15 91 views
25

Ho una matrice numpy in cui ogni cella di una riga specifica rappresenta un valore per una funzione. Li memorizzo tutti in una matrice 100 * 4.Normalizza colonne di array numpy in python

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

Qualsiasi idea di come posso normalizzare i file di questo numpy.array dove ogni valore è compreso tra 0 e 1?

mio output desiderato è:

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

Grazie in anticipo :)

+2

Giusto per essere chiari: si tratta di una serie o di un NumPy Pandas dataframe? –

+1

Durante la programmazione è importante essere specifici: un 'set' è un oggetto particolare in Python e non è possibile avere un set di array numpy. Python non ha una matrice, ma numpy lo fa, e quel tipo 'matrix' non è lo stesso di un numpy' array/ndarray' (che è esso stesso diverso dal tipo 'array' di Python, che non è lo stesso di un 'list'). E nessuno di questi è 'DataFrame's di panda .. – DSM

+0

@ajcr scusa per gli errori di battitura. Ho modificato la mia domanda. Grazie – ahajib

risposta

57

Se ho capito bene, ciò che si vuole fare è dividere per il valore massimo in ogni colonna. Puoi farlo facilmente usando broadcasting.

Partendo tuo esempio matrice:

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) batte massima sulla dimensione 0th (cioè righe). Questo ti dà un vettore di dimensioni (ncols,) contenente il valore massimo in ogni colonna. È quindi possibile dividere x da questo vettore al fine di normalizzare i valori in modo che il valore massimo in ogni colonna verrà scalata a 1.


Se x contiene valori negativi si avrebbe bisogno di sottrarre il minimo prima:

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

Qui, x.ptp(0) restituisce il "picco-picco" (vale a dire il campo, max - min) lungo l'asse 0. Questa normalizzazione garantisce, inoltre, che il valore minimo in ogni colonna sarà 0.

+1

Apprezzo molto la tua risposta, ho sempre problemi con gli "assi"! – ahajib

+5

Per riduzioni (es. '.max()', '.min()', '.sum()', '.mean()' ecc.), Devi solo ricordare che 'axis' specifica la dimensione che tu voglio "collassare" durante la riduzione. Se si desidera il massimo per ogni colonna, è necessario comprimere la dimensione della riga. –

+0

funziona solo per matrici di numeri positivi – rawbeans

6

Puoi uso sklearn.preprocessing:

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 ]]