Angenommen, ich habe ein 1d-Numpy-Array
a = array([1,0,3])
Ich möchte dies als 2d 1-Hot-Array codieren
b = array([[0,1,0,0], [1,0,0,0], [0,0,0,1]])
Gibt es einen schnellen Weg, dies zu tun? Schneller als nur eine Schleife a
, um Elemente von festzulegen b
.
python
numpy
machine-learning
numpy-ndarray
one-hot-encoding
James Atwood
quelle
quelle
b = np.zeros((a.size, a.max()+1))
dann `b [np.arange (a.size), a] = 1`quelle
values
sollte jedoch ein Numpy-Array anstelle einer Python-Liste verwendet werden, dann funktioniert es in allen Dimensionen, nicht nur in 1D.np.max(values) + 1
der Anzahl der Buckets möglicherweise nicht wünschenswert ist, wenn Ihr Datensatz zufällig ausgewählt wurde und zufällig keinen Maximalwert enthält. Die Anzahl der Buckets sollte eher ein Parameter sein, und es kann eine Bestätigung / Überprüfung vorhanden sein, um zu überprüfen, ob jeder Wert innerhalb von 0 (inkl.) Liegt und die Anzahl der Buckets (excl).numpy
Dokumente zu lesen ): An jeder Stelle in der ursprünglichen Matrix (values
) haben wir eine Ganzzahlk
, und wir "setzen" den 1-heißen Vektoreye(n)[k]
an diese Stelle . Dies fügt eine Dimension hinzu, da wir einen Vektor an der Stelle eines Skalars in der ursprünglichen Matrix "platzieren".Wenn Sie Keras verwenden, gibt es dafür ein eingebautes Dienstprogramm:
Und es ist so ziemlich das Gleiche wie die Antwort von @ YXD (siehe Quellcode ).
quelle
Folgendes finde ich nützlich:
Hier
num_classes
steht für die Anzahl der Klassen, die Sie haben. Wenn Sie also einena
Vektor mit der Form (10000,) haben, transformiert diese Funktion ihn in (10000, C) . Beachten Sie, dassa
der Index null ist, dhone_hot(np.array([0, 1]), 2)
geben wird[[1, 0], [0, 1]]
.Genau das, was Sie haben wollten, glaube ich.
PS: Die Quelle sind Sequenzmodelle - deeplearning.ai
quelle
np.eye(num_classes)[a.reshape(-1)]. What you are simply doing is using
Sie mit np.eye` eine (diagonale Größe) viele heißcodierte Arrays erhalten ? Sie erstellen eine Diagonalmatrix mit jedem Klassenindex als 1 Rest Null und später mit den bereitgestellten Indizes durcha.reshape(-1)
Erzeugen der Ausgabe entsprechend dem Index innp.eye()
. Ich habe die Notwendigkeit nicht verstanden,np.sqeeze
da wir es verwenden, um einfach einzelne Dimensionen zu entfernen, die wir niemals haben werden, wie es in der Dimension der Ausgabe immer sein wird(a_flattened_size, num_classes)
Sie können verwenden
sklearn.preprocessing.LabelBinarizer
:Beispiel:
Ausgabe:
Unter anderem können Sie initialisieren,
sklearn.preprocessing.LabelBinarizer()
so dass die Ausgabe vontransform
spärlich ist.quelle
Sie können auch mit Augenfunktion von numpy:
numpy.eye(number of classes)[vector containing the labels]
quelle
np.identity(num_classes)[indices]
könnte die Verwendung besser sein. Gute Antwort!Hier ist eine Funktion, die einen 1-D-Vektor in ein 2-D-One-Hot-Array konvertiert.
Nachfolgend einige Anwendungsbeispiele:
quelle
assert
Möglichkeit, die Vektorform zu überprüfen;)).assert ___
inif not ___ raise Exception(<Reason>)
.Für 1-Hot-Codierung
Beispielsweise
CODIERUNG GENIESSEN
quelle
>>> import numpy as np >>> import pandas >>> a = np.array([1,0,3]) >>> one_hot_encode=pandas.get_dummies(a) >>> print(one_hot_encode) 0 1 3 0 0 1 0 1 1 0 0 2 0 0 1 >>> print(one_hot_encode[1]) 0 1 1 0 2 0 Name: 1, dtype: uint8 >>> print(one_hot_encode[0]) 0 0 1 1 2 0 Name: 0, dtype: uint8 >>> print(one_hot_encode[3]) 0 0 1 0 2 1 Name: 3, dtype: uint8
Ich denke die kurze Antwort ist nein. Für einen allgemeineren Fall in
n
Dimensionen habe ich mir Folgendes ausgedacht:Ich frage mich, ob es eine bessere Lösung gibt - ich mag es nicht, dass ich diese Listen in den letzten beiden Zeilen erstellen muss. Wie auch immer, ich habe einige Messungen mit durchgeführt
timeit
und es scheint, dass dienumpy
-basierte (indices
/arange
) und die iterative Version ungefähr gleich funktionieren .quelle
Um die ausgezeichnete Antwort von K3 --- rnc näher zu erläutern , hier eine allgemeinere Version:
Hier ist auch ein schneller und schmutziger Benchmark dieser Methode und eine Methode aus der derzeit akzeptierten Antwort von YXD (leicht geändert, so dass sie dieselbe API bieten, außer dass letztere nur mit 1D-ndarrays funktioniert):
Die letztere Methode ist ~ 35% schneller (MacBook Pro 13 2015), die erstere ist jedoch allgemeiner:
quelle
Sie können den folgenden Code zum Konvertieren in einen One-Hot-Vektor verwenden:
let x ist der normale Klassenvektor mit einer einzelnen Spalte mit den Klassen 0 bis zu einer bestimmten Zahl:
wenn 0 keine Klasse ist; dann entferne +1.
quelle
Ich bin kürzlich auf ein Problem der gleichen Art gestoßen und habe diese Lösung gefunden, die sich nur dann als zufriedenstellend herausstellte, wenn Sie Zahlen haben, die innerhalb einer bestimmten Formation liegen. Zum Beispiel, wenn Sie die folgende Liste einmalig codieren möchten:
Gehen Sie voran, die veröffentlichten Lösungen sind bereits oben erwähnt. Aber was ist, wenn man diese Daten berücksichtigt:
Wenn Sie dies mit den oben genannten Methoden tun, werden Sie wahrscheinlich 90 One-Hot-Spalten erhalten. Dies liegt daran, dass alle Antworten so etwas wie enthalten
n = np.max(a)+1
. Ich habe eine allgemeinere Lösung gefunden, die für mich funktioniert hat und die ich mit Ihnen teilen wollte:Ich hoffe, jemand hat die gleichen Einschränkungen bei den oben genannten Lösungen festgestellt, und dies könnte sich als nützlich erweisen
quelle
Eine solche Art der Codierung ist normalerweise Teil eines Numpy-Arrays. Wenn Sie ein Numpy-Array wie dieses verwenden:
dann gibt es eine sehr einfache Möglichkeit, dies in 1-Hot-Codierung umzuwandeln
Das ist es.
quelle
saubere und einfache Lösung:
quelle
Verwenden eines Neuraxle- Pipeline-Schritts:
Link zur Dokumentation: neuraxle.steps.numpy.OneHotEncoder
quelle
Hier ist eine Beispielfunktion, die ich geschrieben habe, um dies basierend auf den obigen Antworten und meinem eigenen Anwendungsfall zu tun:
quelle
Ich füge zur Vervollständigung eine einfache Funktion hinzu, die nur numpy-Operatoren verwendet:
Als Eingabe wird eine Wahrscheinlichkeitsmatrix verwendet: z.
Und es wird zurückkehren
quelle
Hier ist eine dimensionsunabhängige Standalone-Lösung.
Dadurch wird jedes N-dimensionale Array
arr
nichtnegativer Ganzzahlen in ein eindimensionales N + 1-dimensionales Array konvertiertone_hot
, wobei diesone_hot[i_1,...,i_N,c] = 1
bedeutetarr[i_1,...,i_N] = c
. Sie können die Eingabe über wiederherstellennp.argmax(one_hot, -1)
quelle
Verwenden Sie den folgenden Code. Es funktioniert am besten.
Fand es hier PS Du musst nicht in den Link gehen.
quelle