从张量生成数量递增的片段

Generate segments of increasing numbers from tensor

假设我有一个像这样的张量。

t1 = tf.constant([0,1,2,3,5,6,7,8,9,10,19,20,21,22,23,24])

我想把它分成几段,包含数字紧邻的组。预期的输出将是这样的:

t2 = [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2]

知道如何使用 tensorflow 方法做到这一点吗?

import tensorflow as tf
t1 = tf.constant([0,1,2,3,5,6,7,8,9,10,19,20,21,22,23,24], dtype=tf.int32)

t2 = tf.roll(t1 - 1, shift=-1, axis=0)
output = tf.math.cumsum(tf.cast(t2 != t1, dtype=tf.int32), exclusive=True)

output # [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]

实现此功能的一种方法如下:

diff = t1[1:] - t1[:-1]
jumps = tf.abs(diff) > 1

t2 = tf.math.cumsum(tf.cast(jumps, 'int32'))
t2 = tf.concat([[0], t2], 0)

我们首先取连续元素之间的差异,然后检查绝对差异是否大于一(在这种情况下数字不相邻)。这会产生一个数组,其中 'jumps' 处为 True,其他地方为 False。 abs 确保正确处理跳转到较低数字(即 [4, 5, 6, 1, 2])。如果你知道数字总是在增加,你可以省略它。

对该数组求和(转换为整数类型)将提供一个数组,其中不同部分表示为整数。最后,由于取差将数组的长度减一,我们在 t2 前面加上 0,因为第一个数字应该属于第一部分。

一个小提示:这会将数字减一(即[4, 5, 6, 5, 4])视为相邻并将它们放在同一部分。