计算两个二维数组之间的张量流的集合差异

时间:2017-11-29 14:25:26

标签: python tensorflow

如何计算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设备,因为此操作对于大型阵列来说计算成本很高。

1 个答案:

答案 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]]]