2017-02-12 55 views
5

Bir dizilim var: input = np.array([[1,0,3,5,0,8,6]]) ve ben [1,3,5,8,6] filtrelemek istiyorum.Bir tensörde sıfır olmayan değerleri filtrele

tf.where'u bir koşulla kullanabildiğinizi biliyorum, ancak döndürülen değer hala içinde 0 bulunur. Aşağıdaki kod parçasının çıktısı [[[1 0 3 5 0 8 6]]]'dur. Ayrıca, neden tf.where'un neden x ve y gereksinimlerini anlamadığını da anlamıyorum.

Sonuçta elde edilen tensörde 0'lardan kurtulabilir miyim?

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) 

cevap

3

İlk olarak durumunuzun doğru olduğunu belirlemek için bir boole maskesi oluşturun; daha sonra maskeyi tensörünüze aşağıda gösterildiği gibi uygulayın. Tf.where'i endekslemek için kullanabilirsiniz - ancak x & y kullanarak bir tensörü döndürür, böylece giriş ile aynı sıradadır, bu sayede daha fazla işe yaramayabilirsiniz. [[[1 -1 3 5 - 1 8 6]]] -1'i daha sonra kaldırmak için tanımlayacağınız bir şeyle değiştirerek. Sadece kullanarak (x & y olmadan), durumunuzun doğru olduğu tüm değerlerin indeksini size verecektir, bu yüzden tercih ederseniz, indeksleri kullanarak bir çözüm oluşturulabilir. Benim tavsiyem en açıklık için aşağıda.

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