我有两个张量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,:]
我敢肯定有一种简单的方法,但是我还没弄清楚。
答案 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)
如果A
,B
和C
是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中数组的索引。