如何计算numpy数组的所有非对角元素的abs的总和?

Pey*_*man 3 python numpy matrix

我是numpy的新手,我想计算numpy数组的所有非对角元素的abs之和.矩阵的非对角元素是矩阵的所有元素,除了在它的主对角线中的元素.

我想计算他们的ABS的总和,所以我可以实现雅可比特征值算法这次讲座

所以,要计算它,我认为这段代码将起作用:

import numpy as np
off_diagonal_sum = 0
for i in range(n): # n is the dimension of our square matrix
    # mat is our matrix
    off_diagonal_sum = off_diagonal_sum + np.sum(np.abs(mat[i, (i + 1):n]))
    off_diagonal_sum = off_diagonal_sum + np.sum(np.abs(mat[i, 0:(i - 1)]))
Run Code Online (Sandbox Code Playgroud)

但由于我是numpy的新手,我认为应该有一种更简单,更短的计算方法.你有什么主意吗?

提前致谢.

She*_*ore 5

在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)
Run Code Online (Sandbox Code Playgroud)
[[12 19 10]
 [ 3 13 18]
 [16 16  6]]
82
Run Code Online (Sandbox Code Playgroud)

替代1

您还可以简单np.trace地使用对角元素的总和,然后从总数组和中减去它,以获得非对角线元素的总和.

off_dia_sum = np.sum(arr) - np.trace(arr)
Run Code Online (Sandbox Code Playgroud)

替代2

使用np.diagonal获得对角线元素,然后取之和从总金额为减

dia_sum = sum(np.diagonal(arr))
off_dia_sum = np.sum(arr) - dia_sum
Run Code Online (Sandbox Code Playgroud)

替代3

使用列表理解,你可以做以下的,你只能元素存储在列表中,如果它是关闭的对角线,这意味着如果这两个指数ij不相等.

size = len(arr)
off_dia_sum = sum([arr[i][j] for i in range(size) for j in range(size) if i!=j])
Run Code Online (Sandbox Code Playgroud)