python - 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 的方式。
解决方案
将我的 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)
推荐阅读
- swift - Appkit:如何在本地文件夹上执行 NSMetadataQuery
- python - 绘制数组中的问题,即信号的 dft
- java - IDE 集成与运行独立 Tomcat
- excel - 如何在同一个工作表iv VBA Excel中超链接到新创建的工作表?
- p-value - 有没有办法查看真正的 p 值,因为 R 显示为 0?
- javascript - Vue 通过多个按钮状态切换
- python - AJAXing 时 QueryDict 在 django 而不是 JSON 中通过
- javascript - Babel 不适用于 IE11 的内置类 Map 扩展
- arrays - 将 Array 结构规范化为 mongoDB 中的多个文档
- c++ - 带有可选参数的 Poco 选项