迭代稀疏数据集的有效方法

计算科学 Python 迭代法 效率
2021-12-17 02:19:58

如果这不是此问题的适当论坛,请致歉。

我有一组元素需要作为建模工作流程的一部分进行迭代。元素存在于一组维度 (i, j, k, l) 上。由于模型约束,不考虑集合中的大部分元素(值 = 0)。因此,以直接的方式循环集合是低效的。例如:

#: Not a good way to do it:
for i in range(n_i):
    for j in range(n_j):
        for k in range(n_k):
            for l in range(n_l):

由于大多数元素都是 0,因此在给定外部循环的索引值的情况下,我应该能够从内部循环中消除它们。例如,假设 n_j = 10,但对于 i=1,模型仅考虑 j = 2,3。然后对于 i=1,我应该只需要迭代 j=2,3,这避免了该循环中约 80% 的迭代。

我想做的是将我的可迭代范围重写为外部循环参数的函数。就像是:

N_i = I(j,k,l)
N_j = J(i,k,l)
N_k = K(i,j,l)
N_l = L(i,j,k)

#: Want to do something like this
for i in I():                        #: loop over all i
    for j in J(i):                   #: loop over j for i = #
        for k in K(i,j):             #: loop over k for i = #, j = #
            for l in L(i,j,k):       #: loop over l for i = #, j = #, k = #

其中 N_i ... N_l 是!= 0 的可迭代集的子集,给定 i,j,k,l 中的一个或多个。

我可以想象构建一个嵌套字典来查找它,但我认为对于循环顺序 i、j、k、l -> i、l、j、k -> l、i、 j,k 等...

我的问题是,为了达到这个目的,构建数据和编写这些函数的有效方法是什么?此外,如果它很重要,我将针对模型的不同方面以不同的顺序迭代维度。

我在 Python 中做这一切,所以解决 Python 实现的答案会很棒。

1个回答

从稀疏矩阵的外观开始,即只有两个索引。在这种情况下,数据通常存储在“压缩行存储”(CSR)或“压缩列存储”(CSC)中。如果您了解如何以这些格式存储数据,您还将了解如何为更高维的情况存储数据——这些通常称为“稀疏张量”,您会发现大量关于这种情况的文献。

其它你可能感兴趣的问题