Eu entendo como um somatório em 1, 2 e 3 dimensões poderia ser definido usando 1, 2 e 3 for
loops respectivamente, mas como você poderia fazer uma função geral que soma um multi-índice como o definido abaixo?
Suponha que u
apenas amostras de um número inteiro aleatório por simplicidade, ou seja,
from random import randint
def u(a=0, b=100):
return randint(a, b)
Por exemplo, digamos o vetor multi-índice js = [0, 0, 0]
e o vetor de limite superior Ms = [5, 5, 5]
, isso implicaria que d = 3
(ou seja, multi-índice tridimensional), e a soma poderia ser escrita simplesmente como abaixo
mysum = 0
for j1 in range(Ms[0]):
for j2 in range(Ms[1]):
for j3 in range(Ms[2]):
mysum += u()
mas qual seria uma maneira geral de escrever isso para d
dimensões (como mostrado na imagem)?
Editar: eu sei que neste exemplo trivial, alguém poderia simplesmente fazer algo como
from numpy import prod
M = prod(Ms)
mysum = sum([u() for i in range(M)])
mas, novamente, estou interessado especificamente em uma maneira geral de fazer loops d
aninhados for
, já que a função u
pode ser mais complexa e depender dos índices j_1, j_2, ..., j_d.
Você pode usar
itertools.product
para produzir todos os conjuntos possíveis de índices para usar em sua funçãoindices
vai serVocê pode realizar somas recursivamente: aplique a função
calculate_sum
a cada elemento que seja uma lista, retornando a soma dos elementos que não são da lista: