给出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。但我认为大多数人都会清楚这一点。
答案 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
时,a
和b
相互广播。
答案 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数组的名称