归一化矩阵python的行 [英] Normalizing rows of a matrix python
问题描述
鉴于python中的二维数组,我想使用以下规范规范每一行:
Given a 2-dimensional array in python, I would like to normalize each row with the following norms:
- 规范1: L_1
- 范数2: L_2
- 标准信息: L_Inf
- Norm 1: L_1
- Norm 2: L_2
- Norm Inf: L_Inf
我已经启动了此代码:
from numpy import linalg as LA
X = np.array([[1, 2, 3, 6],
[4, 5, 6, 5],
[1, 2, 5, 5],
[4, 5,10,25],
[5, 2,10,25]])
print X.shape
x = np.array([LA.norm(v,ord=1) for v in X])
print x
输出:
(5, 4) # array dimension
[12 20 13 44 42] # L1 on each Row
如何修改代码,从而无需使用LOOP就可以直接对矩阵的行进行归一化? (鉴于上述规范值)
How can I modify the code such that WITHOUT using LOOP, I can directly have the rows of the matrix normalized? (Given the norm values above)
我尝试过:
l1 = X.sum(axis=1)
print l1
print X/l1.reshape(5,1)
[12 20 13 44 42]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
但输出为零.
推荐答案
这是L₁规范:
>>> np.abs(X).sum(axis=1)
array([12, 20, 13, 44, 42])
这是L²规范:
>>> np.sqrt((X * X).sum(axis=1))
array([ 7.07106781, 10.09950494, 7.41619849, 27.67670501, 27.45906044])
这是L∞范数:
>>> np.abs(X).max(axis=1)
array([ 6, 6, 5, 25, 25])
要规范化行,只需除以范数即可.例如,使用L 2归一化:
To normalise rows, just divide by the norm. For example, using L₂ normalisation:
>>> l2norm = np.sqrt((X * X).sum(axis=1))
>>> X / l2norm.reshape(5,1)
array([[ 0.14142136, 0.28284271, 0.42426407, 0.84852814],
[ 0.39605902, 0.49507377, 0.59408853, 0.49507377],
[ 0.13483997, 0.26967994, 0.67419986, 0.67419986],
[ 0.14452587, 0.18065734, 0.36131469, 0.90328672],
[ 0.18208926, 0.0728357 , 0.36417852, 0.9104463 ]])
>>> np.sqrt((_ * _).sum(axis=1))
array([ 1., 1., 1., 1., 1.])
如果有可用的话,numpy.linalg
中的norm
方法更直接:
More direct is the norm
method in numpy.linalg
, if you have it available:
>>> from numpy.linalg import norm
>>> norm(X, axis=1, ord=1) # L-1 norm
array([12, 20, 13, 44, 42])
>>> norm(X, axis=1, ord=2) # L-2 norm
array([ 7.07106781, 10.09950494, 7.41619849, 27.67670501, 27.45906044])
>>> norm(X, axis=1, ord=np.inf) # L-∞ norm
array([ 6, 6, 5, 25, 25])
(在OP编辑后):您看到了零值,因为/
是Python 2.x中的整数除法.升级到Python 3,或将dtype更改为float以避免该整数除法:
(after OP edit): You saw zero values because /
is an integer division in Python 2.x. Either upgrade to Python 3, or change dtype to float to avoid that integer division:
>>> linfnorm = norm(X, axis=1, ord=np.inf)
>>> X.astype(np.float) / linfnorm[:,None]
array([[ 0.16666667, 0.33333333, 0.5 , 1. ],
[ 0.66666667, 0.83333333, 1. , 0.83333333],
[ 0.2 , 0.4 , 1. , 1. ],
[ 0.16 , 0.2 , 0.4 , 1. ],
[ 0.2 , 0.08 , 0.4 , 1. ]])
这篇关于归一化矩阵python的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!