在TensorFlow上创建布尔掩码

时间:2017-06-19 17:12:14

标签: python numpy tensorflow

假设我有一个列表

x = [0, 1, 3, 5]

我希望得到尺寸

的张量
s = (10, 7)

这样,x中定义索引的行的第一列为1,否则为0。

对于这个特定的例子,我想获得包含的张量:

T = [[1, 0, 0, 0, 0, 0, 0],
     [1, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0],
     [1, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0],
     [1, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0]]

使用numpy,这将是等效的:

t = np.zeros(s)
t[x, 0] = 1

我找到了related answer,但它并没有真正解决我的问题。

1 个答案:

答案 0 :(得分:2)

试试这个:

import tensorflow as tf 

indices = tf.constant([[0, 1],[3, 5]], dtype=tf.int64)
values = tf.constant([1, 1])
s = (10, 7)

st = tf.SparseTensor(indices, values, s)
st_ordered = tf.sparse_reorder(st)
result = tf.sparse_tensor_to_dense(st_ordered)

sess = tf.Session()
sess.run(result)

这是输出:

array([[0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=int32)

我略微修改了索引,以便您可以看到索引的x,y格式

要获得您最初询问的内容,请设置:

indices = tf.constant([[0, 0], [1, 0],[3, 0], [5, 0]], dtype=tf.int64)

输出:

array([[1, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=int32)