Konvertieren array von Indizes 1-hot codiert numpy array
Sagen wir, ich habe ein 1d-numpy-array
a = array([1,0,3])
Möchte ich zum codieren dieses als 2d-1-hot-array
b = array([[0,1,0,0], [1,0,0,0], [0,0,0,1]])
Gibt es einen schnellen Weg, dies zu tun? Schneller als einfach nur Durchlaufen a
zu legen Elemente der b
ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Array
a
definiert die Spalten der von null verschiedenen Elemente in den Ausgabe-array. Sie müssen auch die Definition der Zeilen und verwenden Sie dann fancy indexing:b = np.zeros((a.size, a.max()+1))
, dann ` b[np.arange(ein.Größe),a] = 1`values
sollte ein Numpy-array anstatt einer Python-Liste, dann funktioniert es in allen Dimensionen, nicht nur in 1D.np.max(values) + 1
als Anzahl der buckets kann nicht wünschenswert sein, wenn Sie Ihre Daten-set wird sagen, nach dem Zufallsprinzip der Stichprobe und nur durch Zufall kann es nicht enthalten, max-Wert. Anzahl der Gruppen sollte eher ein parameter und Durchsetzung/überprüfung kann stattfinden, um zu überprüfen, dass jeder Wert innerhalb von 0 (inkl) und Eimer zählen (exkl).Können Sie
sklearn.Vorverarbeitung.LabelBinarizer
:Beispiel:
Ausgabe:
Unter anderem können Sie initialisieren
sklearn.preprocessing.LabelBinarizer()
so, dass die Ausgabe vontransform
ist spärlich.Hier ist, was ich nützlich finde:
Hier
num_classes
steht für die Anzahl der Klassen, die Sie haben. Also, wenn Siea
Vektor mit der Form der (10000,) diese Funktion wandelt es zu (10000,C). Beachten Sie, dassa
null-indiziert, d.h.one_hot(np.array([0, 1]), 2)
geben[[1, 0], [0, 1]]
.Genau das, was Sie haben wollte, glaube ich.
PS: die Quelle ist Sequenz-Modelle - deeplearning.ai
np.eye(num_classes)[a.reshape(-1)]. What you are simply doing is using
np.Auge`, Sie erstellen eine Diagonale matrix mit jeder Klasse index 1 rest null und später mit den Indizes, zur Verfügung gestellt vona.reshape(-1)
Herstellung der Ausgabe entspricht dem index innp.eye()
. Ich Verstand nicht, die Notwendigkeit vonnp.sqeeze
seit wir es verwenden, um einfach entfernen Sie einzelne Dimensionen, die wir nie haben, als in die Ausgabe die dimension wird immer(a_flattened_size, num_classes)
Falls Sie mit keras, es ist eine integrierte Dienstprogramm für die:
Und es hat so ziemlich das gleiche wie @YXD Antwort (siehe source-code).
Können Sie auch Auge Funktion numpy:
numpy.eye(number of classes)[vector containing the labels]
Hier ist eine Funktion, die wandelt ein 1-D-Vektor in einen 2-D-man-hot-array.
Unten finden Sie einige Beispiel für die Verwendung:
assert
zu überprüfen Vektor-Form 😉 ).Ich glaube, die kurze Antwort ist Nein. Für einen allgemeineren Fall, in
n
Dimensionen, ich kam mit dieser:Frage ich mich, ob es eine bessere Lösung -- ich mag nicht, dass ich zum erstellen dieser Listen in den letzten zwei Zeilen. Wie auch immer, ich habe einige Messungen mit
timeit
und es scheint, dass dienumpy
-basiert (indices
/arange
) und die iterative Versionen durchführen, die über die gleichen.Nur zu erarbeiten, die ausgezeichnete Antwort von K3---rnc, hier ist eine allgemeinere version:
Auch hier ist eine quick-and-dirty-benchmark, der Methode und eine Methode aus dem derzeit akzeptierte Antwort von YXD (leicht verändert, so dass Sie bieten die gleiche API-außer dass letzteres funktioniert nur mit 1D ndarrays):
Letztere Methode ist ~35% schneller (MacBook Pro 13 2015), aber die erstere ist allgemein:
Ich habe vor kurzem lief in ein problem der gleichen Art gefunden und sagte-Lösung, die sich als nur befriedigend, wenn Sie die zahlen haben, die gehen innerhalb einer bestimmten formation. Zum Beispiel, wenn Sie wollen, one-hot Kodieren folgende Liste:
gehen Sie vor, die geposteten Lösungen, die sind schon oben erwähnt. Aber was ist, wenn angesichts dieser Daten:
Wenn man es mit den oben genannten Methoden, werden Sie wahrscheinlich am Ende mit 90 einem heißen Spalten. Dies ist, weil alle Antworten: so etwas wie
n = np.max(a)+1
. Ich fand eine allgemeinere Lösung, die geklappt hat und wollte mit Ihnen zu teilen:Ich hoffe jemand begegnet gleichen Einschränkungen bei den oben genannten Lösungen, und dies kann nützlich sein,
Solche Art der Codierung sind in der Regel Teil der numpy-array. Wenn Sie ein numpy-array wie dieses :
dann es ist sehr einfache Art und Weise zu konvertieren, die auf 1-hot Kodierung
Das ist es.
saubere und einfache Lösung:
Verwenden Sie den folgenden code. Es funktioniert am besten.
Finden Sie hier P. S Sie brauchen nicht zu gehen in den link.
Können Sie verwenden Sie den folgenden code für die Umwandlung in eine one-hot Vektor:
let x ist die normale Klasse Vektor mit einer Spalte mit den Klassen 0 bis einige Nummer:
wenn der Wert 0 ist nicht die Klasse ab; entfernen Sie dann +1.
Hier ist eine Beispiel-Funktion, die ich schrieb, um dies zu tun, basierend auf den Antworten und meiner eigenen Anwendungsfall:
Ich bin hinzufügen, ist für den Abschluss eine einfache Funktion, die nur mithilfe von numpy Betreiber:
Es nimmt als Eingabe eine Wahrscheinlichkeits-matrix: z.B.:
Und es erfolgt die Rückkehr
Hier ist eine Räumlichkeit-unabhängige standalone-Lösung.
Diese konvertieren beliebiges N-dimensionales array
arr
des nicht-negative ganze zahlen in eine one-hot-N+1-dimensionalen arrayone_hot
, woone_hot[i_1,...,i_N,c] = 1
bedeutetarr[i_1,...,i_N] = c
. Sie wiederherstellen können Sie die Eingabe übernp.argmax(one_hot, -1)