如何有效地计算二维累积和
How to compute 2D cumulative sum efficiently
给定一个形状为 (m,n)
的二维数值数组 X
,我想计算一个相同形状的数组 Y
,其中 Y[i,j]
是0<=i_<=i, 0<=j_<=j
的 X[i_,j_]
的累计总和。如果 X
描述二维概率分布,则 Y
可以被认为是二维累积分布函数 (CDF)。
我显然可以在双 for
循环中计算 Y
的所有条目。但是,此计算有一个递归方面,如 Y[i,j] = X[i,j] + Y[i-1,j] + Y[i,j-1] - Y[i-1,j-1]
(其中负索引表示 0)。
我一直在寻找“2d Python cumsum”,我发现 NumPy 的 cumsum
只是使数组变平。
我的问题:
- 是否有一个标准的Python函数可以有效地计算
Y
?
- 如果不是,递归思路是否高于最优?
谢谢。
这里可以应用内核拆分方法来非常有效地解决这个问题,只需要两个np.cumsum
:一个垂直和一个水平(或者其他方式,因为这个是对称的)。
这是一个例子:
x = np.random.randint(0, 10, (4, 5))
print(x)
y = np.cumsum(np.cumsum(x, axis=0), axis=1)
print(y)
结果如下:
[[1 9 8 1 7]
[0 6 8 2 3]
[1 3 6 4 4]
[0 8 1 2 9]]
[[ 1 10 18 19 26]
[ 1 16 32 35 45]
[ 2 20 42 49 63]
[ 2 28 51 60 83]]
给定一个形状为 (m,n)
的二维数值数组 X
,我想计算一个相同形状的数组 Y
,其中 Y[i,j]
是0<=i_<=i, 0<=j_<=j
的 X[i_,j_]
的累计总和。如果 X
描述二维概率分布,则 Y
可以被认为是二维累积分布函数 (CDF)。
我显然可以在双 for
循环中计算 Y
的所有条目。但是,此计算有一个递归方面,如 Y[i,j] = X[i,j] + Y[i-1,j] + Y[i,j-1] - Y[i-1,j-1]
(其中负索引表示 0)。
我一直在寻找“2d Python cumsum”,我发现 NumPy 的 cumsum
只是使数组变平。
我的问题:
- 是否有一个标准的Python函数可以有效地计算
Y
? - 如果不是,递归思路是否高于最优?
谢谢。
这里可以应用内核拆分方法来非常有效地解决这个问题,只需要两个np.cumsum
:一个垂直和一个水平(或者其他方式,因为这个是对称的)。
这是一个例子:
x = np.random.randint(0, 10, (4, 5))
print(x)
y = np.cumsum(np.cumsum(x, axis=0), axis=1)
print(y)
结果如下:
[[1 9 8 1 7]
[0 6 8 2 3]
[1 3 6 4 4]
[0 8 1 2 9]]
[[ 1 10 18 19 26]
[ 1 16 32 35 45]
[ 2 20 42 49 63]
[ 2 28 51 60 83]]