Tensorflow中的笛卡尔积

时间:2017-11-06 08:32:12

标签: python tensorflow

有没有简单的方法在Tensorflow中做笛卡尔积,如itertools.product?我希望得到两个张量的元素组合(ab),在Python中可以通过itertools作为list(product(a, b))。我正在寻找Tensorflow的替代品。

4 个答案:

答案 0 :(得分:6)

我将在此假设ab都是一维张量。

要获得两者的笛卡尔积,我会使用tf.expand_dimstf.tile的组合:

a = tf.constant([1,2,3]) 
b = tf.constant([4,5,6,7]) 

tile_a = tf.tile(tf.expand_dims(a, 1), [1, tf.shape(b)[0]])  
tile_a = tf.expand_dims(tile_a, 2) 
tile_b = tf.tile(tf.expand_dims(b, 0), [tf.shape(a)[0], 1]) 
tile_b = tf.expand_dims(tile_b, 2) 

cartesian_product = tf.concat([tile_a, tile_b], axis=2) 

cart = tf.Session().run(cartesian_product) 

print(cart.shape) 
print(cart) 

你最终得到一个len(a)* len(b)* 2张量,其中ab的每个元素组合都表示在最后一个维度中。

答案 1 :(得分:5)

使用tf.add()广播(已测试)的更短解决方案:

import tensorflow as tf

a = tf.constant([1,2,3]) 
b = tf.constant([4,5,6,7]) 

a, b = a[ None, :, None ], b[ :, None, None ]
cartesian_product = tf.concat( [ a + tf.zeros_like( b ),
                                 tf.zeros_like( a ) + b ], axis = 2 )

with tf.Session() as sess:
    print( sess.run( cartesian_product ) )

将输出:

  

[[[1 4]
    [2 4]
    [3 4]]

     

[[1 5]
    [2 5]
    [3 5]]

     

[[1 6]
    [2 6]
    [3 6]]

     

[[1 7]
    [2 7]
    [3 7]]]

答案 2 :(得分:0)

我的灵感来自Jaba的回答。如果您想获得两个2-D张量的cartesian_product,您可以按照以下方式进行:

输入a:[N,L]和b:[M,L],得到[N * M,L] concat tensor

tile_a = tf.tile(tf.expand_dims(a, 1), [1, M, 1])  
tile_b = tf.tile(tf.expand_dims(b, 0), [N, 1, 1]) 

cartesian_product = tf.concat([tile_a, tile_b], axis=2)   
cartesian = tf.reshape(cartesian_product, [N*M, -1])

cart = tf.Session().run(cartesian) 

print(cart.shape)
print(cart) 

答案 3 :(得分:0)

import tensorflow as tf

a = tf.constant([0, 1, 2])
b = tf.constant([2, 3])
c = tf.stack(tf.meshgrid(a, b, indexing='ij'), axis=-1)
c = tf.reshape(c, (-1, 2))
with tf.Session() as sess:
    print(sess.run(c))

输出:

[[0 2]
 [0 3]
 [1 2]
 [1 3]
 [2 2]
 [2 3]]

贷记给jdehesa:link