2017-12-14 15 views
1

整数エントリを持つ1D numpy配列x(またはテンソルフローテンソル)から始めます。すべてのエントリはNより小さいか等しいです。 今度は(N,N)のテンソルY(すなわちNxN行列)を作成したいと考えています。Y[i,j]=0x[i]!=x[j]Y[i,j]=1x[i]==x[j]の場合はY[i,j]=0となります。 numpyのでテンソルフローのベクトルから2進テンソルを作成する

例:

import numpy as np 
x=np.array([1,2,1,2,3,4,2]) 
Y=np.zeros((x.shape[0],x.shape[0])) 
for i in range(x.shape[0]): 
    for j in range(x.shape[0]): 
     if x[i]==x[j]: 
      Y[i,j]=1 

array([[ 1., 0., 1., 0., 0., 0., 0.], 
     [ 0., 1., 0., 1., 0., 0., 1.], 
     [ 1., 0., 1., 0., 0., 0., 0.], 
     [ 0., 1., 0., 1., 0., 0., 1.], 
     [ 0., 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 0.], 
     [ 0., 1., 0., 1., 0., 0., 1.]]) 

出力はどのようにして、純粋なtensorflowコードで効率的に同じ機能を作成するのですか?

そして:私は、余分なバッチ寸法を持っている場合、入力x(B,N)を形成していると私は形状(B,N,N)とouputをYとして期待するよう何。バッチはすべて互いに独立しています。二つの異なる形状に

答えて

2

リシェープx(B, 1, N)(B, N, 1)ので、それらが適切に放送することができ、これら2つのテンソルを比較し、結果はあなたが1FalseTrue0ことで必要なものを次のようになります。

import tensorflow as tf  
import numpy as np 
x=np.array([1,2,1,2,3,4,2]) 

t = tf.constant(x) 

r = tf.cast(
    tf.equal(
    tf.reshape(t, (-1, 1, t.shape[-1].value)), 
    tf.reshape(t, (-1, t.shape[-1].value, 1)) 
), tf.int8) 

sess = tf.Session() 

sess.run(r) 
#array([[[1, 0, 1, 0, 0, 0, 0], 
#  [0, 1, 0, 1, 0, 0, 1], 
#  [1, 0, 1, 0, 0, 0, 0], 
#  [0, 1, 0, 1, 0, 0, 1], 
#  [0, 0, 0, 0, 1, 0, 0], 
#  [0, 0, 0, 0, 0, 1, 0], 
#  [0, 1, 0, 1, 0, 0, 1]]], dtype=int8) 
2
import tensorflow as tf 
x = tf.constant([1,2,1,2,3,4,2]) 
x = tf.expand_dims(x, axis=0) 
x = tf.tile(x, [x.shape[1], 1]) 
x_ = tf.transpose(x) 
Y = tf.where(tf.equal(x,x_), tf.ones_like(x), tf.zeros_like(x)) 

あなたはベクトルxを持っています。あなたはdimsを展開して行列[1、x.shape]を持つようにします。次に、それを繰り返して同じベクトルのコピーを線に沿って作成します。 x [i] == x [j]はx == x_と等価です。ここで、x_は行列xの転置です。

tf.whereは条件付きテンソルです。条件(x == x_)を与え、各要素について、真であれば最初の値(tf.ones_like)をとり、偽なら2番目の値(tf.zeros_like)をとります。それらの*_like(x)関数は、xと同じ形で0または1でいっぱいのテンソルを生成しています。

関連する問題