如果这不是此问题的适当论坛,请致歉。
我有一组元素需要作为建模工作流程的一部分进行迭代。元素存在于一组维度 (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 实现的答案会很棒。