2015-04-15 9 views
25

Mam tablicę numpy, w której każda komórka określonego wiersza reprezentuje wartość dla funkcji. Przechowuję je wszystkie w macierzy 100 * 4.Znormalizowanie kolumn numpy array w pythonie

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

Każdy pomysł, w jaki sposób mogę normalizować wiersze tego numpy.array, gdzie każda wartość jest między 0 a 1?

My pożądane wyjście jest:

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

góry dzięki :)

+2

Po prostu, aby było jasne: czy to jest tablica NumPy czy Pandas DataFrame? –

+1

Podczas programowania ważne jest, aby być konkretnym: 'set' jest konkretnym obiektem w Pythonie i nie możesz mieć zestawu numpy tablic. Python nie ma macierzy, ale robi to numpy, a typ 'matrix' nie jest tym samym co numpy' tablica/ndarray' (który sam jest różny od typu tablicy 'Python ', który nie jest taki sam jak 'lista'). I żaden z nich nie jest pandami 'DataFrame's .. – DSM

+0

@ajcr przykro mi za literówki. Zmieniłem moje pytanie. Dzięki – ahajib

Odpowiedz

57

Jeśli dobrze rozumiem, co chcesz zrobić, to podzielić przez wartość maksymalną w każdej kolumnie. Możesz to łatwo zrobić, używając broadcasting.

Począwszy przykładowej tablicy:

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) wykonuje maksymalne nad 0th wymiar (tj wiersze). Daje to wektor o rozmiarze (ncols,) zawierający maksymalną wartość w każdej kolumnie. Następnie można podzielić x przez tego wektora w celu normalizacji wartości takie, że maksymalna wartość w każdej kolumnie będą skalowane do 1.


Jeśli x zawiera wartości ujemne trzeba by odjąć minimum pierwsza:

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

Tutaj x.ptp(0) zwraca (czyli zakres, maks - min) „szczyt-szczyt” wzdłuż osi 0. normalizacja także gwarantuje, że minimalna wartość w każdej kolumnie wynosi 0.

+1

Naprawdę doceniam twoją odpowiedź, zawsze mam problemy dotyczące "osi"! – ahajib

+5

Dla redukcji (tj. '.max()', '.min()', '.sum()', '.mean()' itp.), Wystarczy pamiętać, że 'oś' określa wymiar, który chce "zwinąć" podczas redukcji. Jeśli chcesz maksimum dla każdej kolumny, musisz zwinąć wymiar wiersza. –

+0

to działa tylko dla tablic o numerach dodatnich – rawbeans

6

Możesz użyj 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 ]]