Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在一维张量中找到重复元素_Python_Tensorflow - Fatal编程技术网

Python 如何在一维张量中找到重复元素

Python 如何在一维张量中找到重复元素,python,tensorflow,Python,Tensorflow,我想得到在一维张量中多次出现的元素。确切地说,我想创建一个与tf.unique相反的函数。例如,如果x=[1,1,2,3,4,5,6,7,4,5,4]我需要输出为[1,1,4,4,4,5,5],同时也检索源张量中这些元素的索引。 我的最终目标是在一批中获得标签出现多次的示例 您可以使用现有的Tensorflow操作以稍微绕圈的方式完成此操作,方法是对唯一项进行计数,以创建一组密集的唯一项索引,然后使用tf.unsorted_segment_sum对其进行计数。计数完成后,使用tf.greater

我想得到在一维张量中多次出现的元素。确切地说,我想创建一个与tf.unique相反的函数。例如,如果
x=[1,1,2,3,4,5,6,7,4,5,4]
我需要输出为
[1,1,4,4,4,5,5]
,同时也检索源张量中这些元素的索引。
我的最终目标是在一批中获得标签出现多次的示例

您可以使用现有的Tensorflow操作以稍微绕圈的方式完成此操作,方法是对唯一项进行计数,以创建一组密集的唯一项索引,然后使用
tf.unsorted_segment_sum
对其进行计数。计数完成后,使用
tf.greater
选择带有
>N
的项目,并将其重新收集到一个密集列表中:

import tensorflow as tf

a = tf.constant([8, 7, 8, 1, 3, 4, 5, 9, 5, 0, 5])
init = tf.initialize_all_variables()

unique_a_vals, unique_idx = tf.unique(a)
count_a_unique = tf.unsorted_segment_sum(tf.ones_like(a),                   
                                         unique_idx,                        
                                         tf.shape(a)[0])                    

more_than_one = tf.greater(count_a_unique, 1)                               
more_than_one_idx = tf.squeeze(tf.where(more_than_one))                     
more_than_one_vals = tf.squeeze(tf.gather(unique_a_vals, more_than_one_idx))

# If you want the original indexes:                                         
not_duplicated, _ = tf.listdiff(a, more_than_one_vals)                      
dups_in_a, indexes_in_a = tf.listdiff(a, not_duplicated)                    

with tf.Session() as s:                                                     
    s.run(init)                                                             
    a, dupvals, dupidxes, dia = s.run([a, more_than_one_vals,                    
                                  indexes_in_a, dups_in_a])                            
    print "Input: ", a                                                      
    print "Duplicate values: ", dupvals                                     
    print "Indexes of duplicates in a: ", dupidxes
    print "Dup vals with dups: ", dia
输入:[8 7 8 1 3 4 5 9 5 0 5]

重复值:[8 5]

a中重复项的索引:[0 2 6 8 10]

带Dup的Dup VAL:[8 5]


措辞澄清:你真的想要实现一个操作符,还是仅仅想要实现这个功能?(请注意,在tf中,您可以实现一个运算符来完成此操作,但也可以通过将现有tf操作链接在一起来实现。)另外:元素是否在密集范围内(例如,最大值元素是否大致以列表中的元素数为界),或者是任意的(例如,在一个包含10项的列表中,是否可以有一个值为93929923923的元素?)事实上,我只需要这个功能。我的第一次尝试是在张量行和唯一值行上使用tf.unique和双循环,并选择那些不唯一的。但我不知道如何在张量上循环。我需要类似于theano.scan的东西。我的元素的值没有边界。实际上,我正在尝试训练一个三元组twork和我想动态生成训练三元组。我有大量超过1000个的类。我认为此功能将有助于选择三元组的积极元素。(从第一个版本更新,也为您提供a中的原始索引。)我很好奇是否有人可以制作一个更好的版本,而不依赖listdiff功能。谢谢你,给出了这个详细的答案。我知道了。对于listdiff,你是说有更好的方法来实现这一点吗?我不知道。:)可能有更聪明的方法。我只是觉得我的解决方案不是很优雅——它使用了很多相当昂贵的操作来完成一些本质上应该更简单的事情。这个例子值得思考一下。