在矩阵的每列中添加一个数字

时间:2017-06-06 19:18:12

标签: matrix tensorflow vectorization

我有一个矩阵

A = [[  1.  2.  3.]
     [  4.  5.  6.]]

和矢量

b = [ 5.  10.  15.]

我想将A(A[:,i])的每一列添加到b[i],即

[[  6.  12.  18.]
 [  9.  15.  21.]]

一个简单的方法就是

A = tf.constant([[1., 2, 3],[1, 2, 3]])
b = tf.constant([[5, 10, 15.]])
e = tf.ones((2,1))
a + tf.matmul( e, b ) # outer product "repmat"

但这样做似乎非常浪费,必须构建一个我们最终会抛出的整个辅助矩阵。如果不编写自己的操作,是否有一种更为自觉的方式?

1 个答案:

答案 0 :(得分:1)

如前所述,您可以A + b

import tensorflow as tf
tf.InteractiveSession()
A = tf.constant([[1., 2, 3], [4, 5, 6]])
b = tf.constant([[5, 10, 15.]])
(A + b).eval()

返回:

array([[  6.,  12.,  18.],
       [  9.,  15.,  21.]], dtype=float32)

这可行的原因是阵列广播。 Numpy broadcasting page有很好的信息和张量流广播的工作方式相同。基本上对于每个维度(从尾随维度移动到前导维度),tensorflow / numpy尝试检查维度是否兼容(要么它们具有相同数量的元素,要么其中一个只有1个元素)。

在您的情况下,A的形状为[2, 3],而b的形状为[1, 3]。第二个维度匹配,但因为b的第一个维度只有一个元素,b的元素是"广播"沿A的第一维(两个元素)。