В NumPy есть замечательная опция diag_indices , которая возвращает вам индексы диагональных элементов двумерного массива.Используя это, вы можете получить сумму диагональных элементов и вычесть ее из суммы полного массива np.sum(arr)
, чтобы получить сумму внедиагональных элементов без использования явных циклов for.Чтобы получить абсолютную сумму, вы просто используете np.abs
, чтобы получить абсолютные значения каждого элемента, а затем выполните задачу следующим образом.
Пример
import numpy as np
arr = np.random.randint(1, 20, size=(3,3)) # Define a random 2d array
print (arr)
dia = np.diag_indices(3) # indices of diagonal elements
dia_sum = sum(arr[dia]) # sum of diagonal elements
off_dia_sum = np.sum(arr) - dia_sum # subtract the diagonal sum from total array sum
print (off_dia_sum)
[[12 19 10]
[ 3 13 18]
[16 16 6]]
82
Альтернатива 1
Вы также можете просто использовать np.trace
, чтобы получить сумму диагональных элементов, а затем вычесть ее из общей суммы массива, чтобы получить сумму выкл.-диагональные элементы.
off_dia_sum = np.sum(arr) - np.trace(arr)
Альтернативные 2
Использование np.diagonal
для получения диагональных элементов, а затем взять сумму и вычесть из общей суммы как
dia_sum = sum(np.diagonal(arr))
off_dia_sum = np.sum(arr) - dia_sum
Альтернативный 3
Используя понимание списка, вы можете сделать следующее, где вы сохраняете элементы в списке, только если он не по диагонали, что означает, что оба индекса i
и j
не равны.
size = len(arr)
off_dia_sum = sum([arr[i][j] for i in range(size) for j in range(size) if i!=j])