Как удалить последовательные дубликаты в тензорном потоке?

Например, введите одномерный тензор:

l_in = [1,1,2,2,3,4,5,5,1,3,5]

Я хочу удалить последовательные дубликаты, что означает, что вывод должен быть:

l_out = [1,2,3,4,5,1,3,5]

Однако функция tf.unique возвращает только уникальные элементы, указывая на то, что последние три элемента также будут удалены. Вывод tf.unique:

[1,2,3,4,5], [0,0,1,1,2,3,4,4,0,2,4] = tf.unique(l_in)

где второй элемент — это соответствующие идентификаторы.

Есть ли способ удалить только последовательные дубликаты, сохранив при этом неповторяющиеся и неуникальные элементы?


person GEORGE GUO    schedule 10.07.2018    source источник


Ответы (2)


Для одномерных тензоров с использованием вращения/сдвига массива:

import tensorflow as tf

l_in = tf.constant([1,1,2,2,3,4,5,5,1,3,5])
l_left_shift = tf.concat((l_in[1:], [0]), axis=0)
mask_left_shift = tf.not_equal(l_in - l_left_shift, 0)
mask = tf.concat(([True], mask_left_shift[:-1]), axis=0)
l_out = tf.boolean_mask(l_in, mask)

with tf.Session() as sess:
    print(sess.run(l_out))
# [1 2 3 4 5 1 3 5]

(т. е. идея состоит в том, чтобы вычесть каждый элемент с его правым соседом, а затем замаскировать соседа, если результат вычитания равен 0)

person benjaminplanche    schedule 10.07.2018
comment
Большое спасибо! Это четкая и блестящая идея! - person GEORGE GUO; 10.07.2018
comment
Не буду врать, но это было очень умное решение. Обидно, что даже по прошествии стольких лет команда TensorFlow не может предоставить отдельную функцию для этого. Ваше здоровье! - person Snehal; 16.08.2020

Не знаю о тензорном потоке, но поскольку это простой список, вы можете легко использовать groupby из itertools:

from itertools import groupby  
l_out = [x[0] for x in groupby(l_in)]
print(l_out) # prints [1, 2, 3, 4, 5, 1, 3, 5]

См. также: Удаление элементов, которые имеют последовательные дубликаты в Python

person Bernhard    schedule 10.07.2018
comment
Спасибо за Вашу информацию. Я заметил этот ответ до того, как открыл этот вопрос, но не нашел соответствующего решения в тензорном потоке. - person GEORGE GUO; 10.07.2018