【问题标题】:How to do cumulative sum of array for 3 dimensions? (for loop for 3 dimensions)如何做3维数组的累积和? (用于 3 个维度的循环)
【发布时间】:2021-10-27 05:08:15
【问题描述】:

我有一个三维数组

x[i,j,k]=[[[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[i][j][k]=[[[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 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

【问题讨论】:

  • 每个子列表不应该是[[1, 6], [3, 13], [6, 21], [10, 30], [15, 40]]吗?您预期的[1, 21] 中的21 来自哪里?
  • 21 是 (1+2+3+4+5+6) 一个维度的累加到下一维度。 (即累积数组的累积)
  • 您编写了哪些代码来实现您想要完成的任务? minimal reproducible example?你的代码有什么问题?
  • 想要的结果是什么样的?
  • @blhsing 数字 2,3,4,5 在前面的维度中。我现在清楚地编辑了我的要求,您可以在上面查看。

标签: python arrays for-loop multidimensional-array cumsum


【解决方案1】:

您可以使用一些换位技巧来执行以下操作:

from itertools import accumulate, chain

result = []
for l in x:
    a = [*accumulate(chain(*zip(*l)))]  # [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
    result.append([*map(list, zip(a[:len(l)], a[len(l):]))])

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

    

【讨论】:

  • 谢谢,但是我需要在循环中进行,因为我有一些相关的操作和函数依赖于这个值。有没有办法在循环本身内做 cumsum
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 2016-10-24
  • 2017-09-26
  • 1970-01-01
  • 2019-09-20
  • 2016-07-11
  • 2014-12-27
  • 1970-01-01
相关资源
最近更新 更多