2017-02-12 1 views
5

배열이 있다고 가정하면 input = np.array([[1,0,3,5,0,8,6]])이고, 필터링하려면 [1,3,5,8,6]을 필터링하고 싶습니다.텐서 내에서 0이 아닌 값을 필터링합니다.

조건과 함께 tf.where을 사용할 수 있지만 반환 값의 값은 0입니다. 다음 스 니펫의 출력은 [[[1 0 3 5 0 8 6]]]입니다. 또한 tf.wherexy을 모두 필요로하는 이유를 이해하지 못합니다.

어쨌든 나는 결과적인 텐서에서 0을 제거 할 수 있습니까?

import numpy as np 
import tensorflow as tf 

input = np.array([[1,0,3,5,0,8,6]]) 

X = tf.placeholder(tf.int32,[None,7]) 

zeros = tf.zeros_like(X) 
index = tf.not_equal(X,zeros) 
loc = tf.where(index,x=X,y=X) 

with tf.Session() as sess: 
    out = sess.run([loc],feed_dict={X:input}) 
    print np.array(out) 

답변

3

먼저 부울 마스크를 만들어 조건이 참인 부분을 확인하십시오. 다음과 같이 마스크를 텐서에 적용하십시오. 당신은 tf.where를 인덱스로 사용하기를 원할 수 있습니다. 그러나 xy를 입력으로 사용하여 텐서를 반환하므로 입력하지 않아도되도록 최선을 다하면 [[[1 -1 3 5 - 1 8 6]]] -1을 나중에 제거하기 위해 식별 할 수있는 것으로 변경하십시오. where (without x & y)를 사용하면 조건이 맞는 모든 값의 인덱스를 얻을 수 있으므로 원하는 경우 인덱스를 사용하여 솔루션을 만들 수 있습니다. 내 추천은 아래에 가장 명확하게 있습니다.

import numpy as np 
import tensorflow as tf 
input = np.array([[1,0,3,5,0,8,6]]) 
X = tf.placeholder(tf.int32,[None,7]) 
zeros = tf.cast(tf.zeros_like(X),dtype=tf.bool) 
ones = tf.cast(tf.ones_like(X),dtype=tf.bool) 
loc = tf.where(input!=0,ones,zeros) 
result=tf.boolean_mask(input,loc) 
with tf.Session() as sess: 
out = sess.run([result],feed_dict={X:input}) 
print (np.array(out)) 
관련 문제