Tensorflow 中两个张量的交集,同时保持顺序

Intersection of two Tensors in Tensorflow while keeping order

假设我有两个张量

x = tf.constant([["a", "b"], ["c", "d"]]),

y = tf.constant([["b", "c"], ["d", "c"]])

然后,我想得到以下张量:

x_ = [[0, 1], [1, 1]]

y_ = [[1, 0], [1, 1]]

x_是怎样构造的?

x第一行的(0,1)项在y的第一行,所以我们将x_的(0,1)项设置为1。另外,(1, x 的 0) 和 (1,1) 项位于 y 的第二行,因此我们将 x_ 的 (1,0) 和 (1,1) 项设置为等于 1。

y_是如何构造的?

y第一行的(0,0)项在x的第一行,所以我们将y_的(0,0)项设置为1。另外,(1, y 的 0) 和 (1,1) 项位于 x 的第二行,因此我们将 y_ 的 (1,0) 和 (1,1) 项设置为 1。

最丑陋的解决方案:

import tensorflow as tf

x = tf.constant([["a", "b"], ["c", "d"]])
y = tf.constant([["b", "c"], ["d", "c"]])


def func(x, y):

    def compare(v, w):
        return tf.cast(tf.equal(v, w), tf.int32)

    y_rows = tf.range(tf.shape(y)[0])
    x_cols = tf.range(tf.shape(x)[1])
    res = tf.map_fn(lambda t: tf.map_fn(lambda z: compare(x[t,z],y[t]),
                    x_cols, dtype=tf.int32), y_rows, dtype=tf.int32)
    res = tf.reduce_max(res, axis=-1)
    return res


res1 = func(x,y)
res2 = func(y,x)

sess = tf.Session()
print(sess.run(res1))
print(sess.run(res2))
[[0 1]
 [1 1]]
[[1 0]
 [1 1]]

不知道有没有渐变。也许有人会提出更好的建议