Suma de matriz 2D numpy de Python sobre ciertos índices

Jan 18 2021

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

Y solo quiero obtener la suma de ciertos índices que son así:

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

Hubo una pregunta similar sobre la matriz 1-d en stackoverflow en este enlace , pero obtuvo un error cuando intenté usar print(img[indices]). Porque quiero dejar en claro que el elemento de imgson los que indican por índices, y luego obtener el significar suma de ella.

Rendimiento esperado

[5, 7, 9]

Respuestas

2 PabloC Jan 18 2021 at 10:00

Utilice 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

Si el resultado sería [5, 7, 9], que es la suma de la columna de la lista. Entonces 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

Cuando proporciona un índice elegante, cada elemento de la tupla de índice representa un eje diferente. La forma de las matrices de índices se transmite a la forma de la salida que obtiene.

En su caso, las filas de indices.Tson los índices de cada eje. Puede convertirlos en una tupla de índice y agregarlos slice(None), que es el equivalente programático de :. Puede tomar la media de la matriz 2D resultante directamente:

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

Otra forma es utilizar el operador splat:

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