如何通过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)
我有一个三维数组
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)