Python numpy 2D-Arraysumme über bestimmte Indizes
Es gibt ein 2D-Array wie dieses:
img = [
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[2, 2, 2], [3, 2, 3], [6, 7, 6]],
[[9, 8, 1], [9, 8, 3], [9, 8, 5]]
]
Und ich möchte nur die Summe bestimmter Indizes erhalten, die so aussehen:
indices = [[0, 0], [0, 1]] # which means img[0][0] and img[0][1]
# means here is represents
Es gab eine ähnliche Frage zu 1-D-Array im Stackoverflow in diesem Link , aber es wurde ein Fehler angezeigt , als ich versuchte, es zu verwenden print(img[indices])
. Weil ich klarstellen möchte, dass das Element von img
diejenigen sind, die durch Indizes angezeigt werden, und dann das erhalten bedeuten Summe davon.
Erwartete Ausgabe
[5, 7, 9]
Antworten
Verwenden Sie NumPy:
import numpy as np
img = np.array(img)
img[tuple(indices)].sum(axis = 0)
#array([5, 7, 9])
Wenn das Ergebnis [5, 7, 9] wäre, ist dies die Summe über der Spalte der Liste. Dann einfach:
img = np.asarray(img)
indices = [[0, 0], [0, 1]]
img[(indices)].sum(axis = 0)
Ergebnis:
array([5, 7, 9])
Wenn Sie einen ausgefallenen Index angeben, repräsentiert jedes Element des Indextupels eine andere Achse. Die Form der Index-Arrays sendet an die Form der Ausgabe, die Sie erhalten.
In Ihrem Fall sind die Zeilen von indices.T
die Indizes in jeder Achse. Sie können sie in ein Indextupel konvertieren und anhängen slice(None)
, was dem programmatischen Äquivalent von entspricht :
. Sie können den Mittelwert des resultierenden 2D-Arrays direkt ermitteln:
img[tuple(indices.T) + (slice(None),)].sum(0)
Eine andere Möglichkeit ist die Verwendung des Splat-Operators:
img[(*indices.T, slice(None))].sum(0)