如何在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 / b
, a
和b
是相互广播的。
你可以在这里了解更多关于广播的 信息,或者在这里更好。
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