我想知道如何在Python中对多维数组进行累积和的逆运算。
例如,我们可以通过
P
My获得给定二维数组的累积数组
T
问题是,我如何从
import numpy as np
T = np.array([[1,3,2],[5,5,6],[1,8,3]])
P = np.cumsum(np.cumsum(T, axis=0), axis=1)
print(P)
# P is then,
# [[1, 4, 6],
# [6,14,22],
# [7,23,34]]
获取
T
?我想从
P
重建
T
P
上面是一个二维情况,但我需要一个实现,其中
和
T
可以是任何维度。
P
Julia的答案是提供:
Julia 中 cumsum 的逆 不过,我仍在寻找 Python 的答案。
Still, I am seeking the answer for Python.
可以使用
numpy.diff
函数沿给定轴计算数组元素之间的离散差异来反转
numpy
中的
cumsum
操作。
这是一个适用于任何维度数组的Python函数:
import numpy as np
def inverse_cumsum(P, axis=None):
"""
计算多维数组的累积和的反函数。
Args:
P: 输入数组。
axis: 计算差值的轴。如果为 None,则将数组沿最后一个轴进行扁平化处理。
Returns:
P 的累积和的反函数。
"""
if axis is None:
return np.concatenate(([P.flatten()[0]], np.diff(P.flatten())))
else:
return np.concatenate((np.expand_dims(P[(slice(None),) * axis + (0,)], axis=axis), np.diff(P, axis=axis)), axis=axis)
# 示例用法:
T = np.array([[1,3,2],[5,5,6],[1,8,3]])
P = np.cumsum(np.cumsum(T, axis=0), axis=1)
T_recovered = inverse_cumsum(P, axis=1)
T_recovered = inverse_cumsum(T_recovered, axis=0)
print(T_recovered)
这将输出:
[[1 3 2]
[5 5 6]
[1 8 3]]
这就是原始数组
T
。
解释:
-
inverse_cumsum(P, axis)
函数: -
它接受输入数组
P
和可选的axis
参数。 -
如果
axis
为None
,则在计算差值之前,它会将数组沿最后一个轴进行扁平化处理。 -
它使用
np.diff(P, axis=axis)
沿给定轴计算P
中元素之间的差异。这给出了除了第一个元素之外的原始数组。 -
它使用
np.concatenate()
将第一个元素(沿给定轴的第一个元素)和计算出的差值连接起来。 -
它返回结果数组,即
P
的累积和的反函数。 -
示例用法:
-
它首先使用嵌套的
np.cumsum()
调用计算二维数组T
的累积和 (P
)。 -
然后,它调用
inverse_cumsum()
两次,一次用于每个轴,以恢复原始数组T
。 -
最后,它打印恢复的数组
T
。
这个函数适用于任何维度的数组,因为它灵活地处理
axis
参数,并且如果未提供
axis
,则将输入数组视为扁平化数组。