python - 在python中将数字存储在多维(稀疏)数组中的最佳方法
问题描述
当问题是对称的以至于只需要计算一些数字时,什么是 N 维计算的最佳容器对象?
具体来说,对于 N=4 我有:
M=50
results = np.zeros((M,M,M,M))
for ii in range(M):
for jj in range(ii,M):
for kk in range(jj,M):
for ll in range(kk, M):
res=1 #really some calculation
results[ii,jj,kk,ll] = res
此数组中的许多元素是完全冗余的,甚至无法访问。对于更高的 N 更是如此(我想达到 N=10 或理想情况下 N=15)。
对于这样的问题、字典或稀疏矩阵,在每个步骤中使用列表和追加是否更好?我尝试了一个稀疏矩阵,但它一直警告我不应该经常更改稀疏矩阵中的元素,所以这可能不是一个好主意。
我需要保留的唯一功能是找到最大值(最好沿着每个维度)。
任何见解将不胜感激!
解决方案
矩阵的“密度”将是1 / D**2
,其中D
是维数 - 因此您可以看到空间中的收益是指数的,而与列表或密集矩阵相比的性能损失是恒定的。
因此,当维数很高时,稀疏矩阵将在使用空间方面提供巨大优势,并且它们仍然比列表更快。如果维数少,稠密矩阵会稍微大一点,但也只是稍微快一点(这里稍微快一点:快几倍,但由于总执行时间很小,所以绝对差异仍然很小)。
总的来说,除非维数是固定的,否则坚持使用稀疏矩阵更有意义。但是,如果D
是固定的,最好只针对这种特定情况进行基准测试。
推荐阅读
- c++ - 了解带有索引修改的嵌套循环
- html - 变换和缩放不会隐藏溢出的图像
- rust - 打印 Rust 中的所有结构字段
- python - 如何在 Python 中的工具栏菜单后显示选项卡小部件?
- css - @keyframes 动画未运行
- python-3.x - 使用scrapy脚本时遇到问题(选择链接)
- kdtree - 多边形搜索
- cmake - 安装问题:Cmake 错误:include 找不到加载文件:yarpl-exports.cmake
- amazon-web-services - 关于 EC2 的 AWS 问题在 3:23 小时内关闭,您将在 0、3、4、3:23 或 3.24 小时内收取多少费用?
- angular-material - Angular 8 中的材质图标无法正确显示