Πώς να κανονικοποιήσετε έναν πίνακα στο NumPy;

Θα ήθελα να έχω τον κανόνα ενός πίνακα 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
Σχόλια (4)

Θα συμφωνούσα ότι θα ήταν ωραίο αν μια τέτοια λειτουργία ήταν μέρος των μπαταριών που περιλαμβάνονται. Αλλά δεν είναι, απ' όσο γνωρίζω. Εδώ είναι μια έκδοση για αυθαίρετους άξονες και δίνει βέλτιστη απόδοση.

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)))
Σχόλια (10)

Μπορείτε να καθορίσετε 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
Σχόλια (1)