Как сделать совокупную сумму массива в 3 измерениях с помощью python? (для петли в 3 измерениях)

#python #arrays #for-loop #multidimensional-array #cumsum

Вопрос:

У меня есть массив из трех измерений

    x=
[[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]],
 [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]],
 [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]],
 [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]]
 

И мне нужна совокупная сумма, подобная следующей

    y=
[[[1, 21], [3, 28], [6, 36], [10, 45], [15, 55]],
 [[1, 21], [3, 28], [6, 36], [10, 45], [15, 55]],
 [[1, 21], [3, 28], [6, 36], [10, 45], [15, 55]],
 [[1, 21], [3, 28], [6, 36], [10, 45], [15, 55]]]
 

И я хочу добиться этого, используя только цикл for и сумму, т. Е. Без использования каких-либо конкретных функций, таких как numpy или itertools, или каких-либо дополнительных временных переменных.

Я пытался

 for k in range(0,1):
    for j in range(0,5):
        for i in range(0,4):
            y[i][j][k]=sum(sum(x[i][j][k] for jj in range(0,5) if jj<=j)for kk in range(0,1) if kk<=k)
 

но я получил

    y[i][j][k]=[[[1, 12], [3, 26], [6, 42], [10, 60], [15, 80]],
 [[1, 12], [3, 26], [6, 42], [10, 60], [15, 80]],
 [[1, 12], [3, 26], [6, 42], [10, 60], [15, 80]],
 [[1, 12], [3, 26], [6, 42], [10, 60], [15, 80]]]
 

Как сделать цикл в соответствии с моими потребностями?

У меня есть

 x[0][0][0]=1
x[0][1][0]=2
x[0][2][0]=3
x[0][3][0]=4
x[0][4][0]=5
x[0][0][1]=6
x[0][1][1]=7
x[0][2][1]=8
x[0][3][1]=9
x[0][4][1]=10
 

.
.
.
.
Мне нужно сделать

 y[0][0][0]=x[0][0][0]=1
y[0][1][0]=x[0][0][0] x[0][1][0]=3
y[0][2][0]=x[0][0][0] x[0][1][0] x[0][2][0]=6
y[0][3][0]=x[0][0][0] x[0][1][0] x[0][2][0] x[0][3][0]=10
y[0][4][0]=x[0][0][0] x[0][1][0] x[0][2][0] x[0][3][0] x[0][4][0]=15


y[0][0][1]=x[0][0][0] x[0][1][0] x[0][2][0] x[0][3][0] x[0][4][0] x[0][0][1]=21
y[0][1][1]=x[0][0][0] x[0][1][0] x[0][2][0] x[0][3][0] x[0][4][0] x[0][0][1] x[0][1][1]=28
y[0][2][1]=x[0][0][0] x[0][1][0] x[0][2][0] x[0][3][0] x[0][4][0] x[0][0][1] x[0][1][1] x[0][2][1]=36
y[0][3][1]=x[0][0][0] x[0][1][0] x[0][2][0] x[0][3][0] x[0][4][0] x[0][0][1] x[0][1][1] x[0][2][1] x[0][3][1]=45
y[0][4][1]=x[0][0][0] x[0][1][0] x[0][2][0] x[0][3][0] x[0][4][0] x[0][0][1] x[0][1][1] x[0][2][1] x[0][3][1] x[0][4][1]=55
 

.
.
.

(Явно перепечатываю свой вопрос с моими точными требованиями)

Комментарии:

1. Повторная публикация вопросов не обязательно является хорошей идеей

2. Мой предыдущий вопрос был закрыт, так как он неясен, поэтому я публикую его с исправлением, так как не знаю другого варианта.

Ответ №1:

Я полагаю , что обычные cumsum функции поместили 1 бы, а не 21 в y[0][0][1] и т. Д. Этот код будет делать это:

 y=[[[0,0] for b in range(5)] for a in range(4)]
for a in range(4):
    for c in range(2):
        cum = 0
        for b in range(5):
            cum =x[a][b][c]
            y[a][b][c] = cum
 

Но если вы хотите получить 21 , просто переместите cum = 0 линию за пределы c петли

Редактировать

Чтобы избежать дополнительной переменной:

 for a in range(4):
    for c in range(2):
        y[a][0][c] = x[a][0][c]
        for b in range(1,5):
            y[a][b][c] = x[a][b][c]   y[a][b-1][c]
 

2-Е РЕДАКТИРОВАНИЕ

И получить 21 вместо 1 того, чтобы в качестве второго значения первой пары:

 for a in range(4):
    for c in range(2):
        y[a][0][c] = x[a][0][c]
        if c==1:
            y[a][0][1]  = y[a][4][0]
        for b in range(1,5):
            y[a][b][c] = x[a][b][c]   y[a][b-1][c]
 

Комментарии:

1. Хорошо, но, как я уже сказал в своем вопросе, я не хочу использовать для этого какую-либо другую дополнительную временную переменную. Но я могу использовать дополнительный цикл, если это необходимо.

2. Мне нужен 21… В качестве первого вашего ответа я переместил cum=0 за пределы цикла c и получил то, что мне нужно, но с дополнительной переменной. Аналогично для вашего второго ответа, как достичь 21 в соответствии с моим требованием. Не могли бы вы, пожалуйста, помочь с этим.

Ответ №2:

Это должно сработать:

 y = [[[0, 0] for _ in range(len(x[0]))] for _ in range(len(x))]
for lst, ylst in zip(x, y):
    for i, pair in enumerate(lst):
        ylst[i][0] = sum(a for a, _ in lst[:i 1]) 
        ylst[i][1] = sum(a for a, _ in lst)   sum(a for _, a in lst[:i 1])
 

Вы можете выполнить обработку обеих ячеек в каждом подсписке за одну итерацию, используя некоторые уловки с разделением по модулю и по полу:

 # just a readablity helper to get values from nested list by running index
byi = lambda lst, i: lst[i%len(lst)][i//len(lst)] if i >= 0 else 0

y = [[[0, 0] for _ in range(len(x[0]))] for _ in range(len(x))]
for lst, ylst in zip(x, y):
    for i in range(2 * len(lst)):  # processes all 10 cells equally
        ylst[i%len(lst)][i//len(lst)] = byi(lst, i)   byi(ylst, i-1)