An ungeraden Tagen der Woche verstehe ich fast mehrdimensionale Indexierung in numpy. Numpy hat eine Funktion 'take' die scheint zu tun, was ich will, aber mit dem zusätzlichen Bonus, dass ich kontrollieren kann, was passiert, wenn die Indizierung außerhalb des Bereichs ist Speziell habe ich ein 3-dimensionales Array als die Lookup-Tabellenumpy mehrdimensionale Indizierung und die Funktion 'take'
fragenlut = np.ones([13,13,13],np.bool)
und ein 2x2-Array von 3-langen Vektoren als Indizes in die Tabelle
arr = np.arange(12).reshape([2,2,3]) % 13
IIUC zu wirken, war, wenn ich lut[arr]
dann schreiben arr
als 2x2x3 Matrix von Zahlen behandelt wird, und wenn diese verwendet werden, Als Indizes in lut
geben sie jeweils ein 13x13-Array zurück. Dies erklärt, warum lut[arr].shape is (2, 2, 3, 13, 13)
.
Ich kann es tun, was ich durch das Schreiben will
lut[ arr[:,:,0],arr[:,:,1],arr[:,:,2] ] #(is there a better way to write this?)
und jetzt sind die drei Begriffe, als ob sie ein 2x2-Array von Tupeln und lut[<tuple>]
erzeugt ein einzelnes Element aus lut
herzustellen gezippt wurden. Das Endergebnis ist ein 2x2 Array von Einträgen von lut
, genau was ich will.
Ich habe die Dokumentation für die Funktion ‚nehmen‘ ...
Diese Funktion macht das Gleiche wie „fancy“ Indizierung (Indizierung Arrays Arrays); Es kann jedoch einfacher sein zu verwenden, wenn Sie Elemente entlang einer bestimmten Achse benötigen.
und
Achse: int, optional
Die Achse, über die Werte auszuwählen.
Vielleicht naiv, dachte ich, dass axis=2
Einstellung ich drei Werte als 3-Tupel zu verwenden, erhalten würde die Suche durchzuführen, aber tatsächlich
np.take(lut,arr).shape = (2, 2, 3)
np.take(lut,arr,axis=0).shape = (2, 2, 3, 13, 13)
np.take(lut,arr,axis=1).shape = (13, 2, 2, 3, 13)
np.take(lut,arr,axis=2).shape = (13, 13, 2, 2, 3)
so ist es klar, ich verstehe nicht, was los ist auf. Kann mir jemand zeigen, wie ich erreichen kann, was ich will?
Für das, was es wert ist, ist das 'np.take' gleichbedeutend mit der Indizierung' lut.flat': 'lut.flat [np.ravel_multi_index (arr.T, lut.shape)]. T' – hpaulj
Danke an beides für deine Lösungen. Da ravel_multi_index Clipping erlaubt, muss ich überhaupt nicht "nehmen", also werde ich mit @hjpauls Änderung zu Divakars Lösung gehen –