[英]Numpy: Diff on non-adjacent values, in 2D
我想沿axis=-1
(每行)获取二维 numpy 数组中非相邻值的差异。 一个数组可以包含大量的行。
每行都是从 1 到N
的时间轴上的一系列值。
对于N=12
,数组可能看起来像下面的3x12
形状:
timeline = np.array([[ 0, 0, 0, 4, 0, 6, 0, 0, 9, 0, 11, 0],
[ 1, 0, 3, 4, 0, 0, 0, 0, 9, 0, 0, 12],
[ 0, 0, 0, 4, 0, 0, 0, 0, 9, 0, 0, 0]])
所需的结果应如下所示:(数组大小完好无损,position 很重要)
diff = np.array([[ 0, 0, 0, 4, 0, 2, 0, 0, 3, 0, 2, 0],
[ 1, 0, 2, 1, 0, 0, 0, 0, 5, 0, 0, 3],
[ 0, 0, 0, 4, 0, 0, 0, 0, 5, 0, 0, 0]])
我知道一维的解决方案, 非相邻值的差异
imask = np.flatnonzero(timeline)
diff = np.zeros_like(timeline)
diff[imask] = np.diff(timeline[imask], prepend=0)
在其中最后一行可以替换为
diff[imask[0]] = timeline[imask[0]]
diff[imask[1:]] = timeline[imask[1:]] - timeline[imask[:-1]]
第一行可以替换为
imask = np.where(timeline != 0)[0]
试图概括1D
解决方案我可以看到imask = np.flatnonzero(timeline)
是不可取的,因为行变得相互依赖。 因此,我正在尝试使用替代np.nonzero
。
imask = np.nonzero(timeline)
diff = np.zeros_like(timeline)
diff[imask] = np.diff(timeline[imask], prepend=0)
但是,此解决方案会导致行的最终值之间存在联系(相互依赖)。
array([[ 0, 0, 0, 4, 0, 2, 0, 0, 3, 0, 2, 0],
[-10, 0, 2, 1, 0, 0, 0, 0, 5, 0, 0, 3],
[ 0, 0, 0, -8, 0, 0, 0, 0, 5, 0, 0, 0]])
如何使“前置”以零开始每一行?
哇。 我做到了......(这对我来说也是一个有趣的问题......)
我将non_adjacent_diff
function 应用于每一行,并使用np.apply_along_axis
将其应用于每一行。
试试这个代码。
timeline = np.array([[ 0, 0, 0, 4, 0, 6, 0, 0, 9, 0, 11, 0],
[ 1, 0, 3, 4, 0, 0, 0, 0, 9, 0, 0, 12],
[ 0, 0, 0, 4, 0, 0, 0, 0, 9, 0, 0, 0]])
def non_adjacent_diff(row):
not_zero_index = np.where(row != 0)
diff = row[not_zero_index][1:] - row[not_zero_index][:-1]
np.put(row, not_zero_index[0][1:], diff)
return row
np.apply_along_axis(non_adjacent_diff, 1, timeline)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.