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