Je voudrais avoir la norme d'un tableau NumPy. Plus précisément, je cherche une version équivalente de cette fonction
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
Y a-t-il quelque chose comme ça dans skearn
ou numpy
?
Cette fonction fonctionne dans une situation où v
est le vecteur 0.
Si vous utilisez scikit-learn, vous pouvez utiliser 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
Je suis d'accord pour dire que ce serait bien si une telle fonction faisait partie des piles fournies. Mais ce n’est pas le cas, pour autant que je sache. Voici une version pour des axes arbitraires, et donnant des performances optimales.
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)))
Vous pouvez spécifier ord pour obtenir la norme L1. Pour éviter la division par zéro, j'utilise eps, mais ce n'est peut-être pas génial.
def normalize(v):
norm=np.linalg.norm(v, ord=1)
if norm==0:
norm=np.finfo(v.dtype).eps
return v/norm