2016-09-28 11 views
0

英語が苦手な私のタイトルはあいまいかもしれません。このテンソルの '最初の列は、' 重複要素(例えば、[1、2、2、3、4]または[を含めることができ階数2テンソルの要素を取り出す(またはスライスする)方法は、最初の要素が一意です。

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

: は、私はこのようなテンソルaがあるとします。しかし、私はこのことを意味します1,2,3,3,4,5,5])、どの要素が複製されているかは事前に分かっていない。

、私はこのテンソル取り出したい:uが見ることができるよう

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次元テンソルでユニークな要素を見出します。そして、2つの値:yidxを返します。 yには、xにある同じ順序でソートされたxのすべての固有の要素が含まれています。 idxには、固有の出力yの各値のインデックスxが含まれています。

元のテンソルのyの各値の最初のインデックスを含む3番目の戻り値がどのように必要なのでしょうか。xも必要です。ただ、numpyのの同等のような

# 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] 

を行います:私はこのidx_oriをお持ちの場合は

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] 

、私は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]] 
関連する問題