首页 > 解决方案 > numpy中对内存最少的上三角元素求和的最快方法

问题描述

我需要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 的方式。

标签: pythonarraysperformancenumpy

解决方案


将我的 2 美分添加到其他答案和评论中的想法中,您可能会对 1000x1000 对称矩阵的以下时间性能感兴趣。如您所见,该sum_diag方法在这种情况下略微胜出。

import numpy as np

N = 1000
a = np.random.randint(-2000,2000,size=(N,N))
A = (a + a.T)/2

def sum_triu(A):
    return np.triu(A,1).sum()

def sum_diag(A):
    return (A.sum() - np.diag(A).sum())/2

def sum_trace(A):
    return (A.sum() - np.trace(A))/2

%timeit sum_triu(A)
# 3.65 ms ± 406 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit sum_diag(A)
# 663 µs ± 88.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit sum_trace(A)
# 732 µs ± 120 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

推荐阅读