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.

115
demandé sur nbro 2014-01-10 00:25:03

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
92
répondu ali_m 2014-01-09 21:27:58

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)))
30
répondu Eelco Hoogendoorn 2017-10-17 08:05:12

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
12
répondu Eduard Feicho 2016-11-01 12:49:49

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.

2
répondu Jaden Travnik 2018-05-08 22:46:42

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.

2
répondu mk18 2018-08-13 07:27:01

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))
1
répondu Joe 2018-04-24 06:05:06

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()
0
répondu max0r 2018-08-31 07:01:29