2015-04-15 4 views
25

У меня есть массив numpy, где каждая ячейка определенной строки представляет значение для функции. Я храню их все в матрице 100 * 4.Нормализовать столбцы массива numpy в python

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

Любая идея, как я могу нормализовать строки этого numpy.array, где каждое значение находится в пределах от 0 до 1?

Мой желаемый результат:

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

Заранее спасибо :)

+2

Просто, чтобы быть ясным: это массив NumPy или Pandas DataFrame? –

+1

При программировании важно быть конкретным: 'set' является конкретным объектом в Python, и вы не можете иметь набор массивов numpy. Python не имеет матрицы, но numpy делает, и этот тип 'matrix' не совпадает с numpy' array/ndarray' (который сам по себе отличается от типа массива Python, который не совпадает с 'list'). И ни один из них не является пандами 'DataFrame's .. – DSM

+0

@ajcr жаль опечаток. Я редактировал свой вопрос. Спасибо – ahajib

ответ

57

Если я правильно понимаю, что вы хотите сделать, это разделить на максимальное значение в каждом столбце. Вы можете сделать это легко, используя broadcasting.

Начиная с вашего массива, например:

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) занимает максимум по 0-й размерности (т.е. строк). Это дает вам вектор размером (ncols,), содержащий максимальное значение в каждом столбце. Вы можете разделить x этого вектором для того, чтобы нормализовать свои значения таким образом, что максимальное значение в каждом столбце будет отрегулирован 1.


Если x содержит отрицательные значения, нужно будет вычесть минимум первым:

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

Здесь x.ptp(0) возвращает «пик-пик» (т.е. диапазон, макс - мин) вдоль оси 0. Эта нормализация также гарантирует, что минимальное значение в каждом столбце будет 0.

+1

Я очень ценю ваш ответ, у меня всегда есть проблемы с «осью»! – ahajib

+5

Для сокращений (т.е. '.max()', '.min()', '.sum()', '.mean()' и т. Д.), Вам просто нужно помнить, что 'axis' указывает измерение, которое вы хотите «рухнуть» во время сокращения. Если вам нужен максимум для каждого столбца, вам необходимо свернуть размер строки. –

+0

это работает только для массивов положительных чисел – rawbeans

6

Ты можешь использование 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 ]] 
Смежные вопросы