Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定值是否在TensorFlow中的集合中_Python_Set_Tensorflow - Fatal编程技术网

Python 确定值是否在TensorFlow中的集合中

Python 确定值是否在TensorFlow中的集合中,python,set,tensorflow,Python,Set,Tensorflow,tf.logical\u或,tf.logical\u和,以及tf.select功能非常有用 但是,假设您有值x,并且您想查看它是否在集中(a、b、c、d、e)。在python中,您只需编写: if x in set([a, b, c, d, e]): # Do some action. 据我所知,在TensorFlow中实现这一点的唯一方法是将“tf.logical_or”与“tf.equal”一起嵌套。我在下面仅提供了此概念的一次迭代: tf.logical_or( tf.log

tf.logical\u或
tf.logical\u和
,以及
tf.select
功能非常有用

但是,假设您有值
x
,并且您想查看它是否在
集中(a、b、c、d、e)
。在python中,您只需编写:

if x in set([a, b, c, d, e]):
  # Do some action.
据我所知,在TensorFlow中实现这一点的唯一方法是将“tf.logical_or”与“tf.equal”一起嵌套。我在下面仅提供了此概念的一次迭代:

tf.logical_or(
    tf.logical_or(tf.equal(x, a), tf.equal(x, b)),
    tf.logical_or(tf.equal(x, c), tf.equal(x, d))
)

我觉得在TensorFlow中必须有一种更简单的方法来实现这一点。有吗?

看看这个相关的问题:


您应该能够构建一个由[a,b,c,d,e]组成的张量,然后使用
tf.equal(.)

检查任何行是否等于x。要提供更具体的答案,请假设您想检查张量
x
的最后一个维度是否包含1D张量
s
中的任何值,您可以执行以下操作:

tile_multiples = tf.concat([tf.ones(tf.shape(tf.shape(x)), dtype=tf.int32), tf.shape(s)], axis=0)
x_tile = tf.tile(tf.expand_dims(x, -1), tile_multiples)
x_in_s = tf.reduce_any(tf.equal(x_tile, s), -1))
例如,对于
s
x

s = tf.constant([3, 4])
x = tf.constant([[[1, 2, 3, 0, 0], 
                  [4, 4, 4, 0, 0]], 
                 [[3, 5, 5, 6, 4], 
                  [4, 7, 3, 8, 9]]])
x
具有形状
[2,2,5]
并且
s
具有形状
[2]
因此
平铺倍数=[1,1,1,2]
,这意味着我们将沿新维度平铺
x
的最后维度2次(对于
s
中的每个元素一次)。因此,
x_tile
将如下所示:

[[[[1 1]
   [2 2]
   [3 3]
   [0 0]
   [0 0]]

  [[4 4]
   [4 4]
   [4 4]
   [0 0]
   [0 0]]]

 [[[3 3]
   [5 5]
   [5 5]
   [6 6]
   [4 4]]

  [[4 4]
   [7 7]
   [3 3]
   [8 8]
   [9 9]]]]
x_in_s
将把每个平铺值与
s
中的一个值进行比较
tf。如果任何平铺值在
s
中,则沿最后一个dim的任何
都将返回true,给出最终结果:

[[[False False  True False False]
  [ True  True  True False False]]

 [[ True False False False  True]
  [ True False  True False False]]]

这里有两个解决方案,我们想检查
query
是否在
whitelist

whitelist = tf.constant(["CUISINE", "DISH", "RESTAURANT", "ADDRESS"])
query = "RESTAURANT"

#use broadcasting for element-wise tensor operation
broadcast_equal = tf.equal(whitelist, query)

#method 1: using tensor ops
broadcast_equal_int = tf.cast(broadcast_equal, tf.int8)
broadcast_sum = tf.reduce_sum(broadcast_equal_int)

#method 2: using some tf.core API
nz_cnt = tf.count_nonzero(broadcast_equal)

sess.run([broadcast_equal, broadcast_sum, nz_cnt])
#=> [array([False, False,  True, False]), 1, 1]

因此,如果输出为
>0
,则该项在集合中。

感谢您的洞察力。Reduce_sum是最好的方法。你也可以使用
tf.listdiff
来完成同样的事情。@dga只显示差异,而不是相似的差异?对于Tensorflow新手来说,很难看到你的链接帖子如何处理OP的情况。也许您可以在此发布完整的代码片段?当
query
whitelist
都有多个元素时,这是如何工作的?