2015-07-01 2 views
4

У меня есть массив 2D Numpy, в котором я хочу нормализовать каждый столбец до нулевого среднего и единичной дисперсии. Поскольку я в основном используется для C++, метод, которым я занимаюсь, состоит в том, чтобы использовать циклы для итерации по элементам в столбце и выполнять необходимые операции, а затем повторять это для всех столбцов. Я хотел знать о питоническом способе сделать это.Normalize 2D Numpy Array: Zero Mean Unit Variance

Позвольте class_input_data быть моим 2D-массивом. Я могу получить столбец означает, как:

column_mean = numpy.sum(class_input_data, axis = 0)/class_input_data.shape[0] 

я затем вычесть среднее из всех колонок:

class_input_data = class_input_data - column_mean 

В настоящем время, данные должна быть нулевым среднее. Тем не менее, значение:

numpy.sum(class_input_data, axis = 0) 

не равен 0, то это означает, что я сделал что-то неправильно в моей нормализации. By не равно 0, я не имею в виду очень маленькие числа, которые можно отнести к неточностям с плавающей запятой.

+0

Вычтите среднее из каждого столбца и разделите дисперсии. – Evert

+0

Почему бы просто не использовать numpy.mean? – nitbix

+0

@nitbix: Спасибо за ваш комментарий, но я понятия не имею, почему я не использовал его в то время. Возможно, были какие-то проблемы или что-то еще. Однако, это всего лишь несколько месяцев, я не помню других деталей. Из любопытства, как вы наткнулись на этот вопрос сейчас? – therainmaker

ответ

8

Что-то вроде:

import numpy as np 

eg_array = 5 + (np.random.randn(10, 10) * 2) 
normed = (eg_array - eg_array.mean(axis=0))/eg_array.std(axis=0) 

normed.mean(axis=0) 
Out[14]: 
array([ 1.16573418e-16, -7.77156117e-17, -1.77635684e-16, 
     9.43689571e-17, -2.22044605e-17, -6.09234885e-16, 
     -2.22044605e-16, -4.44089210e-17, -7.10542736e-16, 
     4.21884749e-16]) 

normed.std(axis=0) 
Out[15]: array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) 
+0

Не могли бы вы указать на ошибку в коде, который я представил в вопросе? Я чувствую, что это что-то глупое, но не могу понять. – therainmaker

+0

Код в основном выглядит правильно. Если ваши данные искажены (несимметричны вокруг среднего значения), и ваше стандартное отклонение/дисперсия велико, я предполагаю, что это приведет к сумме, которая далека от 0? – Marius

+0

Я использовал этот код в своих данных. Мои данные имеют 42 функции. Первые несколько функций - это два трех порядка величин, больших, чем другие. Наблюдаемый средний вектор имеет первые несколько записей как ненулевые, а последние стремятся к нулю. Любое конкретное объяснение этому? Я не думаю, что дисперсия настолько велика, чтобы создавать любые проблемы – therainmaker