Python 布尔张量的张量流索引

Python 布尔张量的张量流索引,python,indexing,tensorflow,Python,Indexing,Tensorflow,在numpy中,使用两个形状相同的数组,x和y,可以像这样进行切片y[x>1]。如何在tensorflow中获得相同的结果y[tf.greater(x,1)]不起作用,tf.slice也不支持类似的操作。现在有没有一种方法可以使用布尔张量进行索引,或者目前不支持这种方法?目前还没有实现,下面是GitHub跟踪进度的问题--我不会说它完全没有实现。双底片怎么样 Tensorflow实际上支持相当多的切片和切分,尽管语法可能稍微不那么漂亮。例如,如果您想创建一个新数组,该数组在x>1时等于y,否则等

在numpy中,使用两个形状相同的数组,
x
y
,可以像这样进行切片
y[x>1]
。如何在tensorflow中获得相同的结果
y[tf.greater(x,1)]
不起作用,
tf.slice
也不支持类似的操作。现在有没有一种方法可以使用布尔张量进行索引,或者目前不支持这种方法?

目前还没有实现,下面是GitHub跟踪进度的问题--

我不会说它完全没有实现。双底片怎么样

Tensorflow实际上支持相当多的切片和切分,尽管语法可能稍微不那么漂亮。例如,如果您想创建一个新数组,该数组在
x>1
时等于
y
,否则等于0,那么您完全可以这样做。退房

另一方面,如果您想创建一个新数组,其中只包含
x>1
中的成员,则可以通过将
where
聚集
功能组合来实现。有关收集的详细信息,请访问

当然,
x>1
对于
x
是不可微的。。。tf可能很棒,但它不起作用:)

试试看:

ones = tf.ones_like(x) # create a tensor all ones
mask = tf.greater(x, ones) # boolean tensor, mask[i] = True iff x[i] > 1
slice_y_greater_than_one = tf.boolean_mask(y, mask)

编辑:另一种(更好的?)方法:

import tensorflow as tf

x = tf.constant([1, 2, 0, 4])
y = tf.Variable([1, 2, 0, 4])
mask = x > 1
slice_y_greater_than_one = tf.boolean_mask(y, mask)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print (sess.run(slice_y_greater_than_one)) # [2 4]

tf.boolean_mask
完成了这项工作,但在一些平台上,如Raspberry Pi或OSX,Tensorflow wheel发行版不支持此操作(请检查此项。因此,另一种选择是使用@Jackson Loper建议的
where
gather
。例如:

x = tf.Variable([1, 2, 0, 4])
ix = tf.where(x > 1)
y = tf.gather(x, ix)

with tf.Session() as sess:
 sess.run(tf.global_variables_initializer())
 print(sess.run(y))

我们正在寻找类似的功能,以通过定义的标准减少TensorFlow.js张量,但TensorFlow.js没有布尔_掩码功能。在多次拉扯头发和咬牙切齿后,编写了以下内容,基本上总结了真实标准的总数,然后简单地选择topk值来创建子集tens或者

const a = tf.tensor1d([1, 2, 0, 4]);
const b = a.greater(1).sum().get();
const {values, indices} = tf.topk(a, b);
values.print();   # 4,2
indices.print();  # 3,1

要创建值小于或等于1的子集张量,需要在张量上使用tf.neg,因为没有bottomk函数,然后在通过topk获得子集张量后,再次应用tf.neg以恢复原始值。

但是
选择
其中
都将布尔掩码作为输入。如何操作将张量
x
作为输入,生成一个布尔掩码,该掩码为
True
其中
x>1
?看起来我在寻找比较运算符:现在正在跟踪:现在可以使用tf.boolean\u select
const a = tf.tensor1d([1, 2, 0, 4]);
const b = a.greater(1).sum().get();
const {values, indices} = tf.topk(a, b);
values.print();   # 4,2
indices.print();  # 3,1