如何在Python中规范化二维numpy数组less?

给定一个3倍的numpy数组

a = numpy.arange(0,27,3).reshape(3,3) # array([[ 0, 3, 6], # [ 9, 12, 15], # [18, 21, 24]]) 

规范我想到的二维数组的行

 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 

一定有更好的办法,不是吗?

也许要澄清:通过规范我的意思是,每行的总和必须是1。 但是我认为这对大多数人来说是清楚的。

广播对此非常有益:

 row_sums = a.sum(axis=1) new_matrix = a / row_sums[:, numpy.newaxis] 

row_sums[:, numpy.newaxis]将row_sums从(3,)重塑为(3, 1) 。 当你做a / bab是相互广播的。

你可以在这里了解更多关于广播的 信息,或者在这里更好。

Scikit学习有一个规范化的function,可以让你应用各种规范化。 “使它总和为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] 

看来这也是有效的

 def normalizeRows(M): row_sums = M.sum(axis=1) return M / row_sums 

如果你正在试图规范每行的大小是1(即一行的单位长度是一个或每行的平方和的总和是1):

 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]]) 

validation:

 np.sum( result**2, axis=-1 ) # array([ 1., 1., 1.]) 

或者使用lambda函数

 >>> 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的每个vector将有一个单位标准。

你也可以使用matrix换位:

 (aT / row_sums).T