我有两个向量X = [a,b,c,d]
和Y = [m,n,o]
。我想构造一个矩阵M,其中每个元素是从X和Y开始的每一对的操作。即
M[j,i] = f(X[i], Y[j])
# e.g. where f(x,y) = x-y:
M :=
a-m b-m c-m d-m
a-n b-n c-n d-n
a-o b-o c-o d-o
我想我可以用两个tf.while_loop()做到这一点,但这似乎效率低下,我想知道是否有更紧凑和并行的方式来做到这一点。
P.S。有一个轻微的复杂因素,X和Y实际上不是向量,而是R2。即,X和Y中的每个元素本身是固定长度的向量,并且f(X,Y)执行元素方式的f()。另外还有一个批处理组件。
即
X.shape => [BATCH, I, K]
Y.shape => [BATCH, J, K]
M[batch, j, i, k] = f( X[batch, i, k], Y[batch, j, k] )
# e.g.:
= X[batch, i, k] - Y[batch, j, k]
这是使用python API btw
答案 0 :(得分:0)
我通过提高排名和使用broadcasting找到了一种方法。我仍然不知道这是否是最有效的方法,但它比使用tf.while_loop要好得多!我仍然愿意接受建议/改进。
X_expand = tf.expand_dims(X, 1)
Y_expand = tf.expand_dims(Y, 2)
# now I think M = f(X,Y) will broadcast each tensor to the higher dimension on each axis duplicating the data e.g.:
M = X-Y