Ich möchte die Norm eines NumPy-Arrays haben. Insbesondere suche ich nach einer äquivalenten Version dieser Funktion
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
Gibt es so etwas in skearn
oder numpy
?
Diese Funktion funktioniert in einer Situation, in v
der der Vektor 0 ist.
raise
eine Ausnahme!x/np.linalg.norm(x)
nicht viel langsamer war (ca. 15-20%) alsx/np.sqrt((x**2).sum())
in numpy 1.15.1 auf einer CPU.Antworten:
Wenn Sie scikit-learn verwenden, können Sie Folgendes verwenden
sklearn.preprocessing.normalize
:quelle
normalize
erfordert eine 2D-Eingabe. Sie können dasaxis=
Argument übergeben, um anzugeben, ob Sie die Normalisierung auf die Zeilen oder Spalten Ihres Eingabearrays anwenden möchten.np.linalg.norm(x)
standardmäßig die 'l2'-Norm berechnet wird. Wenn Sie möchten, dass die Summe Ihres Vektors 1 ist, sollten Sienp.linalg.norm(x, ord=1)
ndarray
damit es mit dernormalize()
Funktion funktioniert. Ansonsten kann es ein seinlist
.Ich würde zustimmen, dass es schön wäre, wenn eine solche Funktion Teil der mitgelieferten Batterien wäre. Soweit ich weiß, ist es das nicht. Hier ist eine Version für beliebige Achsen, die eine optimale Leistung bietet.
quelle
Sie können ord angeben, um die L1-Norm zu erhalten. Um eine Nullteilung zu vermeiden, verwende ich EPS, aber das ist vielleicht nicht so toll.
quelle
[inf, 1, 2]
Renditen normalisieren[nan, 0, 0]
, aber sollte es nicht sein[1, 0, 0]
?Dies könnte auch für Sie funktionieren
schlägt aber fehl, wenn
v
die Länge 0 ist.quelle
Wenn Sie mehrdimensionale Daten haben und möchten, dass jede Achse auf ihr Maximum oder ihre Summe normiert wird:
Verwendet die Funktion von Spitze zu Spitze .
quelle
Es gibt auch die Funktion
unit_vector()
, Vektoren im populären Transformationsmodul von Christoph Gohlke zu normalisieren :quelle
Sie haben Sci-Kit Learn erwähnt, deshalb möchte ich eine andere Lösung vorstellen.
Sci-Kit lernen
MinMaxScaler
In Sci-Kit Learn gibt es eine API namens
MinMaxScaler
, die den Wertebereich nach Ihren Wünschen anpassen kann.Es befasst sich auch mit NaN-Problemen für uns.
Codebeispiel
Der Code ist einfach, geben Sie einfach ein
Referenzquelle
Ohne
sklearn
und mit nurnumpy
. Definieren Sie einfach eine Funktion:Angenommen, die Zeilen sind die Variablen und die Spalten die samples (
axis= 1
):Ausgabe:
quelle
Wenn Sie in einem 3D-Tensor gespeicherte n-dimensionale Merkmalsvektoren normalisieren möchten, können Sie auch PyTorch verwenden:
quelle
Wenn Sie mit 3D-Vektoren arbeiten, können Sie dies mit dem Toolbelt vg präzise tun . Es ist eine leichte Schicht über Numpy und unterstützt einzelne Werte und gestapelte Vektoren.
Ich habe die Bibliothek bei meinem letzten Start erstellt, wo sie durch solche Verwendungen motiviert war: einfache Ideen, die in NumPy viel zu ausführlich sind.
quelle
Wenn Sie keine äußerste Präzision benötigen, kann Ihre Funktion auf Folgendes reduziert werden:
quelle
Wenn Sie mit mehrdimensionalen Arrays arbeiten, ist eine schnelle Lösung möglich.
Angenommen, wir haben ein 2D-Array, das wir nach der letzten Achse normalisieren möchten, während einige Zeilen die Nullnorm haben.
quelle