Esta es la contestación más válida que te podemos dar, pero primero estúdiala detenidamente y valora si se adapta a tu trabajo.
Solución:
Esta es la norma L₁:
>>> np.abs(X).sum(axis=1)
array([12, 20, 13, 44, 42])
Esta es la norma L₂:
>>> np.sqrt((X * X).sum(axis=1))
array([ 7.07106781, 10.09950494, 7.41619849, 27.67670501, 27.45906044])
Esta es la norma L∞:
>>> np.abs(X).max(axis=1)
array([ 6, 6, 5, 25, 25])
Para normalizar las filas, simplemente divida por la norma. Por ejemplo, usando la normalización L₂:
>>> 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.])
Más directo es el norm
método en numpy.linalg
si lo tienes disponible:
>>> 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])
(después de editar OP): Viste valores cero porque /
es una división entera en Python 2.x. Actualice a Python 3 o cambie dtype a float para evitar esa división de enteros:
>>> 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. ]])
Puedes pasar axis=1
parámetro:
In [58]: LA.norm(X, axis=1, ord=1)
Out[58]: array([12, 20, 13, 44, 42])
In [59]: LA.norm(X, axis=1, ord=2)
Out[59]: array([ 7.07106781, 10.09950494, 7.41619849, 27.67670501, 27.45906044])
Sección de Reseñas y Valoraciones
Si te ha resultado útil este artículo, nos gustaría que lo compartas con otros desarrolladores y nos ayudes a dar difusión a nuestra información.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)