用更少的循环在python / R中实现sigma

时间:2017-07-01 10:26:51

标签: python r

我想在python中实现以下函数:

enter image description here

我将使用2循环编写代码:

for i in range(5):
     for j in range(5):
          sum += f(i, j) 

但问题是我有20个这样的sigma,所以我将不得不编写20个嵌套for循环。它使代码不可读。在我的例子中,所有i和j变量都采用相同的范围(0到4)。有没有更好的编码呢?

2 个答案:

答案 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)来表示15。 (除非你的意思是索引)
  • 不要将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)