Θα ήθελα να έχω τον κανόνα ενός πίνακα NumPy. Πιο συγκεκριμένα, ψάχνω για μια ισοδύναμη έκδοση αυτής της συνάρτησης
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
Υπάρχει κάτι τέτοιο στο skearn
ή στο numpy
;
Αυτή η συνάρτηση λειτουργεί σε μια κατάσταση όπου v
είναι το διάνυσμα 0.
Αν χρησιμοποιείτε το scikit-learn μπορείτε να χρησιμοποιήσετε το 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
Θα συμφωνούσα ότι θα ήταν ωραίο αν μια τέτοια λειτουργία ήταν μέρος των μπαταριών που περιλαμβάνονται. Αλλά δεν είναι, απ' όσο γνωρίζω. Εδώ είναι μια έκδοση για αυθαίρετους άξονες και δίνει βέλτιστη απόδοση.
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)))
Μπορείτε να καθορίσετε ord για να λάβετε τη νόρμα L1. Για να αποφύγω τη μηδενική διαίρεση χρησιμοποιώ το eps, αλλά αυτό ίσως να μην είναι σπουδαίο.
def normalize(v):
norm=np.linalg.norm(v, ord=1)
if norm==0:
norm=np.finfo(v.dtype).eps
return v/norm