2016-09-28 34 views
0

由於我的英語尷尬,我的標題可能不明確。但是,我的意思是這樣的: 假設我有一個張量a這樣的:如何取出(或切片)第一個元素是唯一的等級2張量中的元素?

array([[1, 2, 3], 
     [2, 2, 3], 
     [2, 2, 4], 
     [3, 2, 3], 
     [4, 2, 3]], dtype=int32) 

這個張量的 '第一列中的' 可以包含重複的元素(例如,[1,2,2,3,4]或[ 1,1,2,3,3,4,5,5]),並且哪個元素是重複的,事先是未知的。

,我想帶出一個張這樣的:

array([[1, 2, 3], 
     [2, 2, 3], 
     [3, 2, 3], 
     [4, 2, 3]], dtype=int32) 

就像你看到的,我拿出它的第一個元素是在a列中的獨特元素的行。

我第一次想用的功能tf.unique()。但它返回的idx值並不表示輸出張量在原張量中的每個值的第一個索引。

tf.unique()是這樣的:

# tensor 'x' is [1, 1, 2, 3, 3, 3, 7, 8, 8] 
y, idx = tf.unique(x) 
y ==> [1, 2, 3, 7, 8] 
idx ==> [0, 0, 1, 2, 2, 2, 3, 4, 4] 

功能tf.unique(x, name=None)發現在1-d張量的唯一元素。現在它返回兩個值:yidxy包含了所有排序在礦井相同順序發生在xx的獨特元素。 idx包含唯一輸出y中每個值x的索引。

我如何希望它有第三個返回值,其中包含原始張量x中的每個值y的第一個索引也是需要的。它可能像這樣工作:

# tensor 'x' is [1, 1, 2, 3, 3, 3, 7, 8, 8] 
y, idx, idx_ori = tf.unique(x) 
y ==> [1, 2, 3, 7, 8] 
idx ==> [0, 0, 1, 2, 2, 2, 3, 4, 4] 
idx_ori ==> [0, 2, 3, 6, 7] 

就像它相當於在numpy的作用:

array 'x' is [1, 1, 2, 3, 3, 3, 7, 8, 8] 
y, idx_ori = np.unique(x, return_index=True) 
y ==> [1, 2, 3, 7, 8] 
idx_ori ==> [0, 2, 3, 6, 7] 

,如果我有這個idx_ori,我可以通過tf.gather()解決我的問題:

_, _1, idx_ori = tf.unique(a[:, 0]) 
result = tf.gather(a, idx_ori) 

任何想法解決這個問題?或任何想法得到我想要的這個指標。

P.S.我知道我的描述是冗長...... :-P

回答

0

這是一個有點噁心,但你可以這樣做:

print a 
y, idx = tf.unique(a[:,0]) 
z = tf.one_hot(idx, tf.shape(y)[0]) 
s = tf.cumsum(z) 
e = tf.equal(s, 1) # only seen once so far 
ss = tf.to_int32(e) * tf.to_int32(z) # and we equal the thing 
m = tf.reduce_max(ss, reduction_indices=1) 
out = tf.boolean_mask(a, tf.equal(m, 1)) 
sess = tf.Session() 
print sess.run(out) 

[[1 2 3] 
[2 2 3] 
[2 2 4] 
[3 2 3] 
[4 2 3]] 
[[1 2 3] 
[2 2 3] 
[3 2 3] 
[4 2 3]] 
相關問題