2017-02-12 11 views
5

मान लें कि मेरे पास एक सरणी है: input = np.array([[1,0,3,5,0,8,6]]), और मैं [1,3,5,8,6] फ़िल्टर करना चाहता हूं।एक टेंसर में गैर-शून्य मानों को फ़िल्टर करें

मुझे पता है कि आप एक शर्त के साथ tf.where का उपयोग कर सकते हैं लेकिन लौटा हुआ मूल्य अभी भी 0 में है। निम्नलिखित स्निपेट का आउटपुट [[[1 0 3 5 0 8 6]]] है। मुझे यह भी समझ में नहीं आता कि tf.where को x और y दोनों की आवश्यकता क्यों है।

क्या वैसे भी मैं परिणामस्वरूप टेंसर में 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

सबसे पहले यह बूलियन मास्क बनाएं कि आपकी स्थिति कहां सही है; फिर नीचे दिखाए गए अनुसार, अपने टेंसर पर मास्क लागू करें। यदि आप टीएफ का उपयोग करना चाहते हैं। इंडेक्स के लिए जहां भी - यह x & y का उपयोग करके इनपुट के रूप में एक ही रैंक के साथ एक टेंसर देता है ताकि आगे काम किए बिना आप जो कुछ हासिल कर सकें, वह कुछ ऐसा होगा [[[1 -1 3 5 - 1 8 6]]] कुछ ऐसा बदल रहा है जिसे आप बाद में हटाने के लिए पहचान लेंगे। बस जहां (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)) 
संबंधित मुद्दे