NumPy'de bir dizi nasıl normalleştirilir?

Bir NumPy dizisinin normuna sahip olmak istiyorum. Daha spesifik olarak, bu fonksiyonun eşdeğer bir versiyonunu arıyorum

def normalize(v):
    norm = np.linalg.norm(v)
    if norm == 0: 
       return v
    return v / norm

Skearnveyanumpy` içinde buna benzer bir şey var mı?

Bu fonksiyon vnin 0 vektörü olduğu durumlarda çalışır.

Çözüm

Eğer scikit-learn kullanıyorsanız sklearn.preprocessing.normalize kullanabilirsiniz:

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
Yorumlar (4)

Böyle bir işlevin birlikte verilen pillerin bir parçası olmasının iyi olacağını kabul ediyorum. Ama bildiğim kadarıyla öyle değil. İşte rastgele eksenler için ve optimum performans veren bir versiyon.

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)))
Yorumlar (10)

L1 normunu elde etmek için ord belirtebilirsiniz. Sıfır bölmeden kaçınmak için eps kullanıyorum, ancak bu belki de harika değil.

def normalize(v):
    norm=np.linalg.norm(v, ord=1)
    if norm==0:
        norm=np.finfo(v.dtype).eps
    return v/norm
Yorumlar (1)