Das [Schnellstart-Tutorial] von numpy (https://numpy.org/doc/stable/user/quickstart.html) hat eine weniger grundlegende (nicht sehr grundlegende) Technik, daher dachte ich, dass es interessant wäre, also werde ich sie beim Verständnis einführen.
Der Index des Arrays (der Teil i in einem [i]) hat normalerweise einen skalaren Wert, aber Sie können das Array auch hier einfügen.
import numpy as np
a = np.arange(12)**2
i = np.array([1, 1, 3, 8, 5])
a[i] #array([ 1, 1, 9, 64, 25], dtype=int32)
Was passiert, ist wie in der Abbildung gezeigt.
Ist es ein Bild, dass das Element des Arrays i zu einem Index wird und aus dem Array eines verwendeten extrahiert wird?
Der Index kann auch auf ein zweidimensionales Array angewendet werden. In diesem Fall ist die Ausgabe auch zweidimensional.
j = np.array([[3, 6, 7], [5, 9, 7]])
a[j]
#array([[ 9, 36, 49],
# [25, 81, 49]], dtype=int32)
Im Tutorial wird RGB als Anwendungsbeispiel angegeben, aber es scheint, dass es auch für One-Hot-Ausdrücke verwendet werden kann, die beim maschinellen Lernen verwendet werden.
one_hot = np.array([[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
number = np.array([[0, 1, 2, 0],
[0, 3, 2, 0]])
one_hot[number]
#array([[[0, 0, 0],
# [1, 0, 0],
# [0, 1, 0],
# [0, 0, 0]],
#
# [[0, 0, 0],
# [0, 0, 1],
# [0, 1, 0],
# [0, 0, 0]]])
Beachten Sie übrigens, dass selbst wenn Sie `number [one_hot [number]]`
festlegen, es nicht wiederhergestellt wird.
Sie können auch mehrere Arrays für den Index angeben.
a = np.arange(12).reshape(3,4)
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
i = np.array([[0, 1],
[1, 2]])
j = np.array([[2, 1],
[3, 3]])
a[i, j]
#array([[ 2, 5],
# [ 7, 11]])
Es ist schwierig zu interpretieren, wie damit umgegangen wird, aber es ist wie folgt.
Sie können auch eine Liste als Index des Arrays angeben.
a = np.arange(3,8)
a
#array([3, 4, 5, 6, 7])
a[[1,3,4]] = 0
a
#array([3, 0, 5, 0, 0])
Auch hier wird jedes Element der Liste als Index von a behandelt.
Sie können die Liste verwenden, um alle auf einmal zuzuweisen (zuzuweisen). Wenn die Liste jedoch dieselben Nummern enthält, wird die Zuweisung wiederholt und der letzte Wert zugewiesen.
a = np.arange(3,8)
a
#array([3, 4, 5, 6, 7])
a[[1,1,4]] = [1,2,3]
a
#array([3, 2, 5, 6, 3])
Sie können ein boolesches Array erstellen, indem Sie dem Array einen logischen Operator zuweisen.
Durch die Verwendung eines Booleschen Arrays als Index wird ein eindimensionales Array mit den Elementen, die zu False werden, entfernt (beachten Sie die Form des Arrays).
a = np.arange(-3,9).reshape(3,4)
a
#array([[-3, -2, -1, 0],
# [ 1, 2, 3, 4],
# [ 5, 6, 7, 8]])
b = a > 0
b
#array([[False, False, False, False],
# [ True, True, True, True],
# [ True, True, True, True]])
a[b]
#array([1, 2, 3, 4, 5, 6, 7, 8])
Durch Zuweisen eines booleschen Arrays zu einem indizierten Array können Sie den Elementen, die die Bedingungen erfüllen, gleichzeitig zuweisen.
a[a<0] = 0
a
#array([[0, 0, 0, 0],
# [1, 2, 3, 4],
# [5, 6, 7, 8]])
Komplexere Extraktionen sind möglich, indem dasselbe Boolesche Array wie die Dimensionen (Achse) verwendet wird.
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True])
b2 = np.array([True,False,True,False])
a[b1,:] #a[b1]Aber ja
#array([[ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
a[:,b2] #a[b2]Aber ja
#array([[ 0, 2],
# [ 4, 6],
# [ 8, 10]])
a[b1,b2]
#array([ 4, 10])
Wenn man die Figur betrachtet, sieht es so aus.
Ich frage mich, warum a [b1, b2] [4,10] anstelle von [[4,6], [8,10]] ist. Die Dokumentation sagt auch etwas Seltsames aus, also frage ich mich, ob ich mich daran erinnern muss.
Bisher haben wir die Indizierung von Arrays mithilfe von Arrays und die Indizierung von Booleschen Arrays eingeführt. Es ist eine knifflige Technik, aber sie sollte nützlich sein, wenn Sie sie beherrschen.
Das Tutorial mit dem Link am Anfang enthält andere Techniken (ich habe es weggelassen, weil ich es nicht gut verstehen konnte). Wenn Sie es sich leisten können, lesen Sie es bitte.