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
Skearnveya
numpy` içinde buna benzer bir şey var mı?
Bu fonksiyon v
nin 0 vektörü olduğu durumlarda çalışır.
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
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)))
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