如何计算tensorflow中两个数组元素的集合差异?
示例:我想从b
中删除a
的所有元素:
import numpy as np
a = np.array([[1, 0, 1], [2, 0, 1], [3, 0, 1], [0, 0, 0]])
b = np.array([[1, 0, 1], [2, 0, 1]])
预期结果:
array([[3, 0, 1],
[0, 0, 0]])
可能可以使用tf.sets.set_difference()
完成,但我看不清楚。
在numpy中,you can do something like this,但我正在使用张量流解决方案将此操作卸载到GPU设备,因为此操作对于大型阵列来说计算成本很高。
答案 0 :(得分:0)
这个解决方案怎么样:
import tensorflow as tf
def diff(tens_x, tens_y):
with tf.get_default_graph().as_default():
i=tf.constant(0)
score_list = tf.constant(dtype=tf.int32, value=[])
def cond(score_list, i):
return tf.less(i, tf.shape(tens_y)[0])
def body(score_list, i):
locs_1 = tf.not_equal(tf.gather(tens_y, i), tens_x)
locs = tf.reduce_any(locs_1, axis=1)
ans = tf.reshape(tf.cast(tf.where(locs), dtype=tf.int32), [-1])
score_list = tf.concat([score_list, ans], axis=0)
return [score_list, tf.add(i, 1)]
all_scores, _ = tf.while_loop(cond, body, loop_vars=[score_list, i],
shape_invariants=[tf.TensorShape([None,]), i.get_shape()])
uniq, __, counts = tf.unique_with_counts(all_scores)
return tf.gather(tens_x,tf.gather(uniq, tf.where(counts > tf.shape(tens_y)[0] - 1)))
if __name__ == '__main__':
tens_x = tf.constant([[1, 0, 1], [2, 0, 1], [3, 0, 1], [0, 0, 0]])
tens_y = tf.constant([[1, 0, 1], [2, 0, 1]])
results = diff(tens_x, tens_y)
with tf.Session() as sess:
ans_ = sess.run(results)
print(ans_)
[[[3 0 1]]
[[0 0 0]]]