Suma tablic 2D w języku Python numpy po określonych indeksach

Jan 18 2021

Istnieje tablica dwuwymiarowa, taka jak ta:

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]]
]

Chcę po prostu uzyskać sumę niektórych wskaźników, które są takie:

indices = [[0, 0], [0, 1]] # which means img[0][0] and img[0][1]
# means here is represents

W tym linku było podobne pytanie o tablicę 1-d w przepływie stosu , ale pojawił się błąd, gdy próbowałem użyć print(img[indices]). Ponieważ chcę wyjaśnić, że elementem imgsą te, które wskazują indeksami, a następnie otrzymuję oznaczać suma tego.

Oczekiwany wynik

[5, 7, 9]

Odpowiedzi

2 PabloC Jan 18 2021 at 10:00

Użyj NumPy:

import numpy as np

img = np.array(img)
img[tuple(indices)].sum(axis = 0)
#array([5, 7, 9])
1 TấnNguyên Jan 18 2021 at 10:16

Jeśli wynikiem będzie [5, 7, 9], czyli suma w kolumnie listy. Wtedy łatwo:

img = np.asarray(img)
indices = [[0, 0], [0, 1]]
img[(indices)].sum(axis = 0)

Wynik:

array([5, 7, 9])
1 MadPhysicist Jan 18 2021 at 10:07

Gdy podajesz fantazyjny indeks, każdy element krotki indeksu reprezentuje inną oś. Kształt tablic indeksowych jest transmitowany do kształtu otrzymanego wyniku.

W twoim przypadku rzędy indices.Tto indeksy na każdej osi. Możesz przekonwertować je na krotkę indeksu i dołączyć slice(None), co jest programowym odpowiednikiem :. Możesz bezpośrednio wziąć średnią wynikową tablicę 2D:

img[tuple(indices.T) + (slice(None),)].sum(0)

Innym sposobem jest użycie operatora splat:

img[(*indices.T, slice(None))].sum(0)