我想在python中实现以下函数:
我将使用2循环编写代码:
for i in range(5):
for j in range(5):
sum += f(i, j)
但问题是我有20个这样的sigma,所以我将不得不编写20个嵌套for循环。它使代码不可读。在我的例子中,所有i和j变量都采用相同的范围(0到4)。有没有更好的编码呢?
答案 0 :(得分:1)
您可以使用itertools.product
获取笛卡尔积(针对您的案例的索引):
>>> import itertools
>>> for i, j, k in itertools.product(range(1, 3), repeat=3):
... print(i, j, k)
...
1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
2 2 2
import itertools
total = 0
for indexes in itertools.product(range(5), repeat=20):
total += f(*indexes)
range(1,6)
代替range(5)
来表示1
到5
。 (除非你的意思是索引)sum
用作变量名称,它会隐藏内置函数sum
。答案 1 :(得分:-1)
使用Numpy创建数组。
import numpy as np
i = np.asarray([i for i in range(5)])
j = np.asarray([i for i in range(5)])
res = np.sum(f(i,j))
所以你可以避免所有循环。需要注意的是,函数f需要能够使用数组(所谓的ufunc)。如果你的f更复杂,我不允许数组,你可以使用numpys矢量化函数。不如ufunc快,但嵌套循环更好:
from numpy import vectorize
f_vec = vectorize(f)
如果你想使用普通的python,因为你不想要数组但是列表或类型不匹配数组,总会有列表理解加速循环。说我和J分别是i和j的可迭代:
ij = [f(i,j) for i in I for j in J ]
res = sum(ij)