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的新手,我认为应该有一种更简单,更短的计算方法.你有什么主意吗?
提前致谢.
在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
使用列表理解,你可以做以下的,你只能元素存储在列表中,如果它是关闭的对角线,这意味着如果这两个指数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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3969 次 |
| 最近记录: |