首页 > 解决方案 > 如何通过python做3维数组的累积和?(用于 3 维循环)

问题描述

我有一个三维数组

   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 循环和 sum 来实现这一点,即不使用任何特定函数,如 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

. . .

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

标签: pythonarraysfor-loopmultidimensional-arraycumsum

解决方案


我相信通常的cumsum功能会放1, not 21, iny[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]

推荐阅读