我希望能够计算出大的n维numpy数组的累积和。最终数组中每个元素的值应该是索引大于或等于当前元素的所有元素的总和。
2D:xᶦʲ=Σxᵐⁿᵐⁿm≥i且n≥j
3D:xᶦʲᵏ=Σxᵐⁿᵒᵐⁿᵒm≥i且n≥j且o≥k
2D中的示例:
1 1 0 2 1 0
1 1 1 -> 5 3 1
1 1 1 8 5 2
1 2 3 6 5 3
4 5 6 -> 21 16 9
7 8 9 45 33 18
3D示例:
1 1 1 3 2 1
1 1 1 6 4 2
1 1 1 9 6 3
1 1 1 6 4 2
1 1 1 -> 12 8 4
1 1 1 18 12 6
1 1 1 9 6 3
1 1 1 18 12 6
1 1 1 27 18 9
答案 0 :(得分:2)
沿着最后一个轴翻转,沿着它移动,沿着第二个轴向后翻转,最后沿着第一个轴向前移动,直到第一个轴 -
def multidim_cumsum(a):
out = a[...,::-1].cumsum(-1)[...,::-1]
for i in range(2,a.ndim+1):
np.cumsum(out, axis=-i, out=out)
return out
示例2D案例运行 -
In [107]: a
Out[107]:
array([[1, 1, 0],
[1, 1, 1],
[1, 1, 1]])
In [108]: multidim_cumsum(a)
Out[108]:
array([[2, 1, 0],
[5, 3, 1],
[8, 5, 2]])
示例3D案例运行 -
In [110]: a
Out[110]:
array([[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]]])
In [111]: multidim_cumsum(a)
Out[111]:
array([[[ 3, 2, 1],
[ 6, 4, 2],
[ 9, 6, 3]],
[[ 6, 4, 2],
[12, 8, 4],
[18, 12, 6]],
[[ 9, 6, 3],
[18, 12, 6],
[27, 18, 9]]])
答案 1 :(得分:2)
对于那些想要“ numpy
”型积木的人,其左上角最小:
def multidim_cumsum(a):
out = a.cumsum(-1)
for i in range(2,a.ndim+1):
np.cumsum(out, axis=-i, out=out)
return out
从@Divakar修改(感谢他!)
答案 2 :(得分:1)
这是一般解决方案。我按照说明进行操作,而不是示例,即垂直显示的顺序是自上而下而不是自下而上:
import itertools as it
import functools as ft
ft.reduce(np.cumsum, it.chain((a[a.ndim*(np.s_[::-1],)],), range(a.ndim)))[a.ndim*(np.s_[::-1],)]
或就地:
for i in range(a.ndim):
b = a.swapaxes(0, i)[::-1]
b.cumsum(axis=0, out=b)