Python 3.x 从张量中获取值的随机索引

Python 3.x 从张量中获取值的随机索引,python-3.x,tensorflow,Python 3.x,Tensorflow,我有一个包含一些数值的张量张量: [ [0,0,0,1,1,1], [1,2,1,0,1,0] ... ] 对于每个张量,我想得到一个零值的随机指数。 因此,对于第一个张量,可能的输出值是0,1,2,对于第二个张量,可能的输出值是3,5。(我只想从这些可能的结果中随机抽取一个,比如[0,5]) 在tensorflow中实现这一点的最佳方法是什么 这是一种可能的解决方案: import tensorflow as tf # Input data nums = tf.placeholder(t

我有一个包含一些数值的张量张量:

[ [0,0,0,1,1,1], [1,2,1,0,1,0] ... ] 
对于每个张量,我想得到一个零值的随机指数。 因此,对于第一个张量,可能的输出值是
0,1,2
,对于第二个张量,可能的输出值是
3,5
。(我只想从这些可能的结果中随机抽取一个,比如
[0,5]


在tensorflow中实现这一点的最佳方法是什么

这是一种可能的解决方案:

import tensorflow as tf

# Input data
nums = tf.placeholder(tf.int32, [None, None])
rows = tf.shape(nums)[0]
# Number of zeros on each row
zero_mask = tf.cast(tf.equal(nums, 0), tf.int32)
num_zeros = tf.reduce_sum(zero_mask, axis=1)
# Random values
r = tf.random_uniform([rows], 0, 1, dtype=tf.float32)
# Multiply by the number of zeros to decide which of the zeros you pick
zero_idx = tf.cast(tf.floor(r * tf.cast(num_zeros, r.dtype)), tf.int32)
# Find the indices of the smallest values, which should be the zeros
_, zero_pos = tf.nn.top_k(-nums, k=tf.maximum(tf.reduce_max(num_zeros), 1))
# Select the corresponding position of each row
result = tf.gather_nd(zero_pos, tf.stack([tf.range(rows), zero_idx], axis=1))
# Test
with tf.Session() as sess:
    x = [[0,0,0,1,1,1],
         [1,2,1,0,1,0]]
    print(sess.run(result, feed_dict={nums: x}))
    print(sess.run(result, feed_dict={nums: x}))
    print(sess.run(result, feed_dict={nums: x}))
示例输出:

[1 3]
[2 5]
[0 3]
如果某一行没有任何零,则它将拾取索引0,不过您可以制作一个掩码来过滤具有以下内容的索引:

has_zeros = tf.reduce_any(tf.equal(nums, 0), axis=1)

数据中会有负数吗?(也就是说,
0
是否总是尽可能最小的值?)!这对我有用。我会把这个问题留一点时间,以防万一有人想出一个同样适用于负数的通用解决方案,但如果没有人给出答案,我会很快标记你的答案。@Xitcod13谢谢你的评论,你是对的。不过,我更新了解决方案,修复了一个错误,并对其进行了轻微的更改,使其能够在无需更多工作的情况下实现任何价值。