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]]
不知道有没有渐变。也许有人会提出更好的建议
假设我有两个张量
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]]
不知道有没有渐变。也许有人会提出更好的建议