我必须计算一个指标乘积的总和(请参阅附带的方程式)。每个索引有N个和(每个索引都为a),并且乘积包含取决于特定索引(我不想指定)的函数。我尝试过使用双循环
nlist = []
for i in range(a):
nlist.append([0])
for k in range(N):
nlist[i].append(k+1)
prod=1
result=0
for i in range(a):
for k in range(0,N):
prod = prod*f(nlist[i][k])
result = result+prod
但是我完全不确定正确的顺序以及正确定义数组nlist[i][k]
的方式,以使求和正确。
答案 0 :(得分:1)
prod
应该在每个产品迭代开始时重置为1。产品应嵌套在总和以下。
result = 0
for i in range(a):
prod = 1 # <<< begin at 1 on each iteration of i
for k in range(N):
prod *= f(nlist[i][k])
result += prod
执行此操作的更好方法可能是使用理解功能和sum
内置函数。与循环相比,这可以说是更数学的表示。
from operator import mul
from functools import reduce, partial
product = partial(reduce, mul) # let's define a handy lil' function
result = sum(product(map(f, l)) for l in nlist)
# other variants
# sum(product(f(n_k) for n_k in l) for l in nlist)
# sum(reduce(mul, map(f, l)) for l in nlist)
如果您正在考虑使用NumPy模块,则可以使用np.prod
,which is considerably faster over reduce(mul, ...)
。
import numpy as np
product = np.prod
result = ...
答案 1 :(得分:0)
假设您的函数可以应用于numpy数组,并且让nk值为一个(a,N)大小的数组,则只需将两个操作数作为import numpy as np
a = 10
N =3
nlist = np.repeat(np.arange(N), a).reshape((N ,a)).T # [[0, 1, 2], [0,1,2], ...
f = lambda x: 2 * x + 1
result = f(nlist).prod(1).sum()
print(result)
>> 150
一起应用即可,例如
prod = 1
result = 0
for i in range(a):
prod = 1
for k in range(0,N):
prod = prod*f(nlist[i][k])
result = result+prod
print(result)
>> 150
比较:
--from-file