Python 任意数量嵌套for循环的算法
我试图找出一种算法,将我的代码推广为参数的任意整数值,该参数在我的代码中控制嵌套for循环的数量。我的代码大致如下Python 任意数量嵌套for循环的算法,python,algorithm,numpy,Python,Algorithm,Numpy,我试图找出一种算法,将我的代码推广为参数的任意整数值,该参数在我的代码中控制嵌套for循环的数量。我的代码大致如下 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
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循环的数量由任意整数控制
谢谢你的建议 首先:你确定要这样做吗?随着循环数量的增加,实际执行的语句数量将迅速增加,除了极少量的循环之外,您的代码将变得非常缓慢,可能会非常缓慢,以至于无法使用。我会考虑你是否真的需要这些循环 撇开这一点不谈,我会递归地这样做:
def nextloop(counter, coefficients, vectors):
counter = counter - 1
if counter == 0:
result = 0
for i in range(len(vectors)):
result += coefficients[i] * vectors[i]
return result
else:
return nextloop(counter, coefficients, vectors)
finalresult = nextloop(5, coeffs, vecs) # Adjust initial call appropriately
这并不完全正确,因为我不太清楚您的算法在每个循环上都做了什么,但您可以根据需要对其进行修改。正如前面所指出的,这将很快爆发。但是,您可以使用笛卡尔乘积迭代器:
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.]])
谢谢你快速而有用的回答。我不太清楚你所说的系数是什么意思。在我上面的例子中,X的sum中的系数是循环变量(计数器)。正如我所说的,我不太清楚你的代码实际上做了什么,所以我的例子不太可能是你想要的。关键是你可以让一个函数递归地调用它自己,你可以传递任何你喜欢的函数参数。在本例中,我预计您希望传递值
A[0]
,A[1]
A[n]
以及向量(所以您需要一个包含值和向量列表的列表),但任何对您有用的东西!谢谢你。这似乎是正确的方向。然而,我还不能完全让它工作。让我更精确一点。An实际上是numpy矩阵中的线,即A1=a[0]。我希望X是一个维度矩阵(len(a[0])X(pq…*z)。(pq…*z)X(len(a[0])。好了,现在更清楚什么是a了,我将尝试修复我的代码。谢谢。我也相应地编辑了原始问题。这还不太有效,只返回一个0的矩阵。