Сумма индексов по продукту, содержащему индексы - PullRequest
0 голосов
/ 11 апреля 2019

Я должен вычислить сумму по произведению индексов (см. Прилагаемое уравнение). Есть 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], чтобы суммирование было правильным.

Equation

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

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, , что значительно быстрее по сравнению с reduce(mul, ...).

import numpy as np
product = np.prod

result = ...
0 голосов
/ 11 апреля 2019

при условии, что ваша функция может быть применена к массиву-пустышкам, и, позволяя вашим значениям nk быть массивом (a, N), вы можете просто применить два операнда вместе как prod(1).sum(), например,

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...