我需要对对称矩阵进行类型求和
i<j
这相当于对矩阵的上三角元素求和,不包括对角线。
给定
A
对称
N x N
数组,最简单的解决方案是
np.triu(A,1).sum()
但是我想知道是否存在需要更少内存的更快方法。
看起来
(A.sum() - np.diag(A).sum())/2
在大型数组上更快,但是如何避免从
N x 1
创建
np.diag
数组?
双重嵌套 for 循环不需要额外的内存,但这显然不是 Python 中的正确方法。
以下是使用 NumPy 在对称矩阵中对上三角元素求和的有效方法:
import numpy as np
A = np.array([[1, 2, 3],
[2, 4, 5],
[3, 5, 6]])
upper_sum = np.sum(A[np.triu_indices(n=A.shape[0], k=1)])
这段代码做了以下操作:
-
np.triu_indices(n=A.shape[0], k=1)
: 此函数生成表示矩阵上三角部分中元素的索引元组(不包括对角线,因为k=1
)。 -
A[...]
: 这将使用生成的索引提取矩阵A
中上三角部分的元素。 -
np.sum(...)
: 此函数计算提取元素的总和。
此方法直接访问内存中的必要元素,避免生成任何大型临时数组,使其在内存效率和性能方面均高效。
以下是一些其他提示:
- 确保你的矩阵确实是对称的。如果不是,则此方法将无法正常工作。
-
如果你重复执行此操作,请考虑将
np.triu_indices
的结果存储在变量中,然后重复使用它以避免重复计算。
我希望这会有所帮助!如果还有其他问题,请告诉我。
标签:python,arrays,performance,numpy From: 54629601