2017-12-14 1 views
1

정수 엔트리로 1D numpy 배열 x (또는 tensorflow 텐서)부터 시작합니다. 모든 항목은 N보다 작거나 같습니다. 이제는 (N,N) 모양의 텐서 Y (즉, NxN 행렬)을 만들고 싶습니다. Y[i,j]=0 인 경우 x[i]!=x[j]Y[i,j]=1 인 경우 x[i]==x[j]입니다. NumPy와와tensorflow에서 벡터로부터 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 

출력 내가 순수 tensorflow 코드에 효율적으로 동일한 기능을 만들려면 어떻게해야합니까

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.]]) 

?

그리고 : 나는, 추가 배치 차원이있는 경우 입력 x(B,N)을 형성하고 난 모양 (B,N,N)과 OUPUT Y으로 기대 있도록 무엇. 일괄 처리는 모두 서로 독립적입니다.

답변

2

두 개의 서로 다른 모양, (B, 1, N)(B, N, 1)에 모양 변경 x 그래서 그들은 제대로 방송 될 수있다, 그 다음이 두 텐서을 비교, 결과는 당신이 1False되는 True0 인으로 필요한 것 :

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_)을 지정하고 각 요소에 대해 true이면 첫 번째 값 (tf.ones_like)을 취하고 false이면 두 번째 값 (tf.zeros_like)을 취합니다. 그 *_like(x) 함수는 x와 같은 모양으로 0 또는 1로 가득 찬 텐서를 생성합니다.

관련 문제