首页 > 解决方案 > 在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)。

对于这样的问题、字典或稀疏矩阵,在每个步骤中使用列表和追加是否更好?我尝试了一个稀疏矩阵,但它一直警告我不应该经常更改稀疏矩阵中的元素,所以这可能不是一个好主意。

我需要保留的唯一功能是找到最大值(最好沿着每个维度)。

任何见解将不胜感激!

标签: pythonnumpyscipy

解决方案


矩阵的“密度”将是1 / D**2,其中D是维数 - 因此您可以看到空间中的收益是指数的,而与列表或密集矩阵相比的性能损失是恒定的。

因此,当维数很高时,稀疏矩阵将在使用空间方面提供巨大优势,并且它们仍然比列表更快。如果维数少,稠密矩阵会稍微大一点,但也只是稍微快一点(这里稍微快一点:快几倍,但由于总执行时间很小,所以绝对差异仍然很小)。

总的来说,除非维数是固定的,否则坚持使用稀疏矩阵更有意义。但是,如果D是固定的,最好只针对这种特定情况进行基准测试。


推荐阅读