繁体   English   中英

Numpy:非相邻值的差异,2D

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM