Как получить сумму значений по диагонали в numpy?

Учитывая двумерный прямоугольный массив numpy:

a = np.array([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
])

Я хотел бы взять сумму всех значений под диагональю от нижнего левого до верхнего правого угла, т.е. 8, 9 и 6.

Как лучше всего этого добиться?

Этот метод должен работать и для больших массивов.


person Rutger Hofste    schedule 04.06.2019    source источник
comment
Что вы считаете диагональю? Не знаю, зачем 9 включена.   -  person msi_gerva    schedule 04.06.2019
comment
Возможно, диагональ как «направо и вниз от вторичной диагонали»?   -  person TrebledJ    schedule 04.06.2019
comment
хорошая точка зрения. Это диагональ от нижнего левого угла до верхнего правого. Отредактировал вопрос.   -  person Rutger Hofste    schedule 04.06.2019
comment
Пожалуйста, примите ответ, если вы считаете, что он решит вашу проблему. Это поможет сообществу в целом признать правильное решение. Это можно сделать, нажав на зеленую галочку рядом с ответом. См. Это изображение для справки. Ваше здоровье.   -  person Austin    schedule 08.06.2019


Ответы (3)


Вы можете вращать, просуммировать верхний треугольник и вычесть диагональ.

import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
result = np.triu(np.rot90(a)).sum() - np.trace(a)
#Output: 23
person Paritosh Singh    schedule 04.06.2019

Вы можете использовать np.flip + _ 2_ + _ 3_:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print(np.sum(np.tril(np.flip(a, 1), -1)))
# 23
person Austin    schedule 04.06.2019

Вы можете использовать scipy.spatial.distance.squareform, чтобы выбрать интересующий вас треугольник:

from scipy.spatial.distance import squareform
squareform(a[::-1], checks=False)
# array([8, 9, 6])
squareform(a[::-1], checks=False).sum()
# 23 
person Paul Panzer    schedule 04.06.2019