Сумма 2D-массива Python numpy по определенным индексам

Jan 18 2021

Вот такой двумерный массив:

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

И я просто хочу получить сумму определенных индексов, которые выглядят так:

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

В этой ссылке был аналогичный вопрос об одномерном массиве в stackoverflow , но при попытке использовать возникла ошибка print(img[indices]). Потому что я хочу прояснить, что элементы - imgэто те, которые указываются индексами, а затем получить иметь в виду сумма этого.

Ожидаемый результат

[5, 7, 9]

Ответы

2 PabloC Jan 18 2021 at 10:00

Используйте 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

Если результат будет [5, 7, 9], который является суммой по столбцу списка. Тогда легко:

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

Результат:

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

Когда вы указываете причудливый индекс, каждый элемент кортежа индекса представляет другую ось. Форма индексных массивов транслируется в соответствии с формой получаемого вами вывода.

В вашем случае строки indices.T- это индексы на каждой оси. Вы можете преобразовать их в индексный кортеж и добавить slice(None), что является программным эквивалентом :. Вы можете напрямую взять среднее значение результирующего 2D-массива:

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

Другой способ - использовать оператор splat:

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