Как нормализовать 2-мерный массив numpy в python менее подробно?
учитывая 3 раза 3 numpy массив
a = numpy.arange(0,27,3).reshape(3,3)
# array([[ 0, 3, 6],
# [ 9, 12, 15],
# [18, 21, 24]])
чтобы нормализовать строки 2-мерного массива, о котором я думал
row_sums = a.sum(axis=1) # array([ 9, 36, 63])
new_matrix = numpy.zeros((3,3))
for i, (row, row_sum) in enumerate(zip(a, row_sums)):
new_matrix[i,:] = row / row_sum
там должен быть лучший способ, не так ли?
возможно, чтобы прояснить: под нормализацией я имею в виду, что сумма записей в строке должна быть одна. Но я думаю, что это будет понятно большинству людей.
7 ответов:
Scikit-learn имеет функцию нормализации, которая позволяет применять различные нормализации. "Make it sum to 1" - это норма L1, и чтобы это сделать:
from sklearn.preprocessing import normalize matrix = numpy.arange(0,27,3).reshape(3,3).astype(numpy.float64) #array([[ 0., 3., 6.], # [ 9., 12., 15.], # [ 18., 21., 24.]]) normed_matrix = normalize(matrix, axis=1, norm='l1') #[[ 0. 0.33333333 0.66666667] #[ 0.25 0.33333333 0.41666667] #[ 0.28571429 0.33333333 0.38095238]]теперь ваши строки будут подведены к 1.
Я думаю, что это должно работать,
a = numpy.arange(0,27.,3).reshape(3,3) a /= a.sum(axis=1)[:,numpy.newaxis]
в случае, если вы пытаетесь нормализовать каждую строку таким образом, что ее величина равна единице (т. е. длина единицы строки равна единице или сумма квадратов каждого элемента в строке равна единице):
import numpy as np a = np.arange(0,27,3).reshape(3,3) result = a / np.linalg.norm(a, axis=-1)[:, np.newaxis] # array([[ 0. , 0.4472136 , 0.89442719], # [ 0.42426407, 0.56568542, 0.70710678], # [ 0.49153915, 0.57346234, 0.65538554]])проверка:
np.sum( result**2, axis=-1 ) # array([ 1., 1., 1.])
или с помощью лямбда-функции, как
>>> vec = np.arange(0,27,3).reshape(3,3) >>> import numpy as np >>> norm_vec = map(lambda row: row/np.linalg.norm(row), vec)каждый вектор vec будет иметь единичную норму.
Comments