Python numpy 2D array somma su determinati indici

Jan 18 2021

C'è un array 2-d come questo:

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

E voglio solo ottenere la somma di alcuni indici che sono come questo:

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

C'era una domanda simile sull'array 1-d in stackoverflow in questo link , ma ha ricevuto un errore quando ho provato a usare print(img[indices]). Perché voglio mettere in chiaro che l'elemento di imgsono quelli che indica gli indici, e quindi ottenere il significare somma di esso.

Uscita prevista

[5, 7, 9]

Risposte

2 PabloC Jan 18 2021 at 10:00

Usa 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

Se il risultato sarebbe [5, 7, 9] che è la somma sulla colonna della lista. Quindi facile:

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

Risultato:

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

Quando fornisci un indice di fantasia, ogni elemento della tupla indice rappresenta un asse diverso. La forma degli array di indice viene trasmessa in base alla forma dell'output ottenuto.

Nel tuo caso, le righe di indices.Tsono gli indici in ciascun asse. Puoi convertirli in una tupla di indice e aggiungere slice(None), che è l'equivalente programmatico di :. Puoi prendere direttamente la media dell'array 2D risultante:

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

Un altro modo è usare l'operatore splat:

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