Soma da matriz 2D numpy Python sobre certos índices

Jan 18 2021

Existe uma matriz 2-d como esta:

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 eu só quero obter a soma de certos índices que são assim:

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

Houve uma pergunta semelhante sobre o array 1-d em stackoverflow neste link , mas ocorreu um erro quando tentei usar print(img[indices]). Porque eu quero deixar claro que o elemento de imgsão aqueles que indicam por índices, e então obter o mau soma disso.

Saída esperada

[5, 7, 9]

Respostas

2 PabloC Jan 18 2021 at 10:00

Use 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 o resultado for [5, 7, 9], que é a soma da coluna da lista. Então fácil:

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

Resultado:

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

Quando você fornece um índice sofisticado, cada elemento da tupla do índice representa um eixo diferente. A forma das matrizes de índice difunde para a forma da saída que você obtém.

No seu caso, as linhas de indices.Tsão os índices em cada eixo. Você pode convertê-los em uma tupla de índice e anexar slice(None), que é o equivalente programático de :. Você pode obter a média da matriz 2D resultante diretamente:

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

Outra maneira é usar o operador splat:

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