使用张量流对两个张量进行排序和合并

时间:2018-08-24 11:26:22

标签: python-3.x sorting tensorflow merge

我有两个张量A和B,每个张量分别为Nx3。我也有一个布尔张量C = Nx1。我想使用此布尔值按照C的值合并A和B。例如:

A = [[ a1, a2, a3],
     [ a4, a5, a6],
     [ a7, a8, a9]]

B = [[ b1, b2, b3],
     [ b4, b5, b6],
     [ b7, b8, b9]]

C = [True, True, False]

我想要获得的是这样的东西:

D = [[[ a1, a2, a3],
      [ b1, b2, b3]],

     [[ a4, a5, a6],
      [ b4, b5, b6]],

     [[ b7, b8, b9],
      [ a7, a8, a9]]]

如您所见,两个张量已合并,并且行的先行顺序由C的值确定。

通过合并原始张量的行,将两个Nx3张量A和B合并为一个D = Nx2x3张量。将它们添加到Nx2x3张量的顺序取决于布尔张量C,即

  

如果C [i] = True,D [i,0 ,:] = A [i ,:]和D [i,1,:] = B [i,:]。如果C [i] = False,则D [i,0,:] = B [i,:]和D [i,1,:] = A [i,:]

我敢肯定有一种简单的方法,但是我还没弄清楚。

2 个答案:

答案 0 :(得分:0)

所以我找到了一种解决方案,尽管它可能不是一个有效的解决方案。万一其他人遇到相同的问题,我的解决方法如下(使用与上面相同的A,B,C和D):

row_num = tf.cast(tf.reshape(tf.range(A.shape[0]), [-1, 1]), tf.int64)
AB = tf.concat([tf.expand_dims(A, 1), tf.expand_dims(B, 1)], axis=1)
filt_top = tf.reshape(tf.cast(C, tf.int64), [-1, 1])
filt_bottom = tf.reshape(tf.cast(tf.logical_not(C), tf.int64), [-1, 1])
filt = tf.concat([row_num, filt_top, filt_bottom], axis=1)
D_top = tf.map_fn(lambda x: AB[x[0], x[1], :], filt, dtype=tf.float32)
D_bottom = tf.map_fn(lambda x: AB[x[0], x[2], :], filt, dtype=tf.float32)
D = tf.concat([D_top, D_bottom], axis=1)

答案 1 :(得分:0)

如果ABC是Numpy的数组,则可以使用Numpy的屏蔽索引技术以这种方式合并它们:

D = np.zeros((N,2,3))
D[C,0,:] = A[C]
D[~C,0,:] = B[~C]
D[~C,1,:] = A[~C]
D[C,1,:] = B[C]   

实际上,C不必是Numpy的数组。列表可以作为Python中数组的索引。