任意数量嵌套 for 循环的算法 [英] Algorithm for arbitrary number of nested for loops

查看:39
本文介绍了任意数量嵌套 for 循环的算法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找出一种算法,将我的代码概括为参数的任意整数值,该参数在我的代码中控制嵌套 for 循环的数量.我的代码示意性地看起来像

I am trying to figure out an algorithm to generalise my code for an arbitrary integer value of a parameter that in my code controls the number of nested for loops. My code schematically looks like

A = numpy matrix of dimension (n x m)

For i = 0:p
 For j = 0:q
  ...
   For l = 0:z

     X[counter] = A[0]*i + A[1]*j + ... + A[n]*l
     counter = counter + 1

X = numpy matrix of dimension (p*q*...*z x len(A[0]))

其中 for 循环的数量由任意整数控制.

where the number of for loops is controlled by an arbitrary integer number.

感谢您的建议!

推荐答案

正如所指出的,这会很快爆发.但是,您可以使用笛卡尔积迭代器:

As pointed out, this will blowup very quickly. However you can use cartesian product iterator:

import itertools
import numpy as np

# Create a list with ranges:
rngs=np.array([p,q,..,z])

#Initialize X empty
X = np.empty((rngs.prod(), A.shape[0]))

#Cycle over all cartesian products
for i,t in enumerate(itertools.product(*[range(i) for i in rngs])):
    X[i,:] = sum([A[i,:] * t[i] for i in range(len(t))])

测试数据:

A = np.random.randint(10, size=(10, 10))
A
array([[8, 5, 0, 2, 0, 4, 5, 5, 0, 9],
       [7, 0, 5, 9, 9, 4, 8, 2, 6, 8],
       [4, 3, 8, 5, 2, 5, 4, 8, 6, 1],
       [0, 5, 6, 5, 5, 0, 8, 5, 4, 9],
       [3, 3, 2, 6, 6, 9, 7, 7, 3, 3],
       [4, 0, 7, 2, 3, 2, 2, 4, 1, 2],
       [6, 2, 5, 9, 9, 9, 4, 7, 7, 3],
       [6, 3, 4, 9, 0, 3, 8, 1, 6, 8],
       [6, 5, 6, 0, 8, 7, 9, 0, 7, 4],
       [2, 1, 4, 1, 3, 8, 3, 3, 2, 9]])

rngs = np.random.randint(1, 5, size=10)
rngs
array([4, 2, 1, 2, 2, 3, 4, 4, 2, 4])

X = np.empty((rngs.prod(), A.shape[0]))

for i,t in enumerate(itertools.product(*[range(i) for i in rngs])):
    X[i,:] = sum([A[i,:] * t[i] for i in range(len(t))])

X
array([[  0.,   0.,   0., ...,   0.,   0.,   0.],
       [  2.,   1.,   4., ...,   3.,   2.,   9.],
       [  4.,   2.,   8., ...,   6.,   4.,  18.],
       ...,
       [ 86.,  44.,  64., ...,  64.,  63.,  97.],
       [ 88.,  45.,  68., ...,  67.,  65., 106.],
       [ 90.,  46.,  72., ...,  70.,  67., 115.]])

这篇关于任意数量嵌套 for 循环的算法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆