Saltar al contenido

Normalización de filas de una matriz Python

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.linalgsi 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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *