#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)