【问题标题】:Iterating a for loop?迭代for循环?
【发布时间】:2019-01-08 14:59:12
【问题描述】:

在 Python 中是否可以迭代一个 for 循环?这种构造的代码是什么样的?

要清楚,这就是我所说的迭代 for 循环的意思:

for i in range(100):
     for j in range(100):
         for k in range(100):
...
             for n in range(100):
                  print(i+j+k+...+n)

这是一个我希望简化的具体示例:

data0=numpy.random.normal(0,1,100)
data1=numpy.random.normal(0,1,100)
data2=numpy.random.normal(0,1,100)
A=numpy.zeros(100*100*100)
for i in range(len(data0)):
    for j in range(len(data1)):
        for k in range(len(data2)):
             A[i*len(data0)*len(data1)+j*len(data0)+k]=data[i]+data[j]+data[k]

有可能吗?

【问题讨论】:

  • 你自己试过了吗?
  • 你可能需要itertools.product
  • 你试过递归方法吗?
  • 为什么投反对票?
  • @Dole 你的帖子不是最清楚的。我觉得有点难以理解。请注意错误的答案,您可能需要编辑您的问题。

标签: python iteration


【解决方案1】:

看起来您要求进行一种称为Loop Unrolling 的优化。为此,您需要从最低的嵌套级别向上查看优化(可能是确定性的)。

在这种情况下,这是不可能的。一般来说,这个循环相当于设置张量A[i,j,k] = d0[i]+d1[j]+d2[k];的每个元素在某种意义上,这是一个一对多的操作。

但是,如果数据向量 data0data1data2 中存在规则模式,您可以利用一些可以提供帮助的启发式方法。不过,在这种情况下,您已将它们设置为随机向量,因此没有关于组织或结构的基本假设是有用的。

【讨论】:

  • 我不是在要求优化,而是一种使代码更紧凑并让用户设置的 for 循环数量串联的方法。最好是pythonic方式。
  • 坦率地说,嵌套循环 pythonic。这些对于导航张量本身的每个维度的更清晰的方式是特别必要的。
  • 也许,尽管当连续 6 个循环时,它开始看起来有点乱。然而,定义任意数量的循环仍然存在问题。我的计划是编辑问题,以便在时间允许的情况下更清楚。