Comment normaliser un tableau dans NumPy?
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.
7 réponses
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 que c'était bien si une telle fonction faisait partie des batteries incluses. Mais ce n'est pas le cas, pour autant que je sache. Voici une version pour les 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 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
Si vous avez des données multidimensionnelles et que vous voulez que chaque axe soit normalisé à lui-même:
def normalize(d):
# d is a (n x dimension) np array
d -= np.min(d, axis=0)
d /= np.ptp(d, axis=0)
return d
Utilise numpys crête à crête function.
Cela pourrait aussi fonctionner pour vous
import numpy as np
normalized_v = v / np.sqrt((np.sum(v**2)))
Mais échoue lorsque v
a une longueur 0.
Il y a aussi la fonction unit_vector()
pour normaliser les vecteurs dans le module transformations populaire par Christoph Gohlke:
import transformations as trafo
import numpy as np
data = np.array([[1.0, 1.0, 0.0],
[1.0, 1.0, 1.0],
[1.0, 2.0, 3.0]])
print(trafo.unit_vector(data, axis=1))
Si vous voulez normaliser n vecteurs d'entités dimensionnelles stockés dans un tenseur 3D, vous pouvez également utiliser PyTorch:
import numpy as np
from torch import FloatTensor
from torch.nn.functional import normalize
vecs = np.random.rand(3, 16, 16, 16)
norm_vecs = normalize(FloatTensor(vecs), dim=0, eps=1e-16).numpy()