如何通过python对3维数组求和? (用于 3 维循环)

How to do cumulative sum of array in 3 dimension by python? (for loop in 3 dimension)

我有一个三维数组

   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]]]

如何根据我的需要进行for循环?

我有

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

。 . .

(清楚地重新发布我的问题和我的确切要求)

我相信通常的 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]

第二次编辑

并获取 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]

这应该有效:

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)