Me gustaría tener la norma de un array de NumPy. Más específicamente, estoy buscando una versión equivalente de esta función
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
¿Hay algo así en skearn
o numpy
?
Esta función funciona en una situación en la que v
es el vector 0.
Si utiliza scikit-learn puede utilizar sklearn.preprocessing.normalize
:
import numpy as np
from sklearn.preprocessing import normalize
x = np.random.rand(1000)*10
norm1 = x / np.linalg.norm(x)
norm2 = normalize(x[:,np.newaxis], axis=0).ravel()
print np.all(norm1 == norm2)
# True
Estoy de acuerdo en que estaría bien que esa función formara parte de las pilas incluidas. Pero no lo es, que yo sepa. Aquí hay una versión para ejes arbitrarios, y que da un rendimiento óptimo.
import numpy as np
def normalized(a, axis=-1, order=2):
l2 = np.atleast_1d(np.linalg.norm(a, order, axis))
l2[l2==0] = 1
return a / np.expand_dims(l2, axis)
A = np.random.randn(3,3,3)
print(normalized(A,0))
print(normalized(A,1))
print(normalized(A,2))
print(normalized(np.arange(3)[:,None]))
print(normalized(np.arange(3)))