Например, введите 1-й тензор:
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)
где второй элемент соответствует соответствующим идентификаторам.
Есть ли способ удалить только повторяющиеся дубликаты при сохранении не дублированных и неповторимых элементов?
Для 1D-тензоров, использующих вращение/смещение матрицы:
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)
Не знаю о тензорном потоке, но, поскольку это простой список, вы можете легко использовать 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