如何规范化python中的二维numpy数组更简洁?

时间:2012-01-18 03:12:41

标签: python arrays syntax numpy normalization

给出3次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。但我认为大多数人都会清楚这一点。

11 个答案:

答案 0 :(得分:114)

广播真的很有用:

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

row_sums[:, numpy.newaxis]将row_sums从(3,)重塑为(3, 1)。当您执行a / b时,ab相互广播。

您可以详细了解广播 here甚至更好here

答案 1 :(得分:78)

Scikit-learn具有规范化功能,可让您应用各种规范化。 "使其总和为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。

答案 2 :(得分:8)

我认为这应该有用,

a = numpy.arange(0,27.,3).reshape(3,3)

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

答案 3 :(得分:3)

如果你试图将每一行标准化,使其大小为1(即行的单位长度为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]])

验证

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

答案 4 :(得分:1)

似乎这也有效

carousel.cycle('pause');

答案 5 :(得分:1)

您可以使用内置的numpy函数: np.linalg.norm(a, axis = 1, keepdims = True)

答案 6 :(得分:0)

或使用lambda函数,如

goto

vec的每个向量都有一个单位范数。

答案 7 :(得分:0)

你也可以使用矩阵换位:

(a.T / row_sums).T

答案 8 :(得分:0)

我认为您可以通过以下方式将行元素之和标准化为1:     select date_format(`date`,'%m-%d') as d, categoryid, max(value) as value from tablename group by date_format(`date`,'%m-%d'),categoryid 。 并且可以使用new_matrix = a / a.sum(axis=1, keepdims=1)完成列规范化。希望这可以帮助您。

答案 9 :(得分:0)

这是使用reshape的另一种可能的方法:

a_norm = (a/a.sum(axis=1).reshape(-1,1)).round(3)
print(a_norm)

或者使用None也可以:

a_norm = (a/a.sum(axis=1)[:,None]).round(3)
print(a_norm)

输出

array([[0.   , 0.333, 0.667],
       [0.25 , 0.333, 0.417],
       [0.286, 0.333, 0.381]])

答案 10 :(得分:-1)

normed_matrix = normalize(input_data, axis=1, norm='l1')
print(normed_matrix)

其中input_data是2D数组的名称