在第一维使用广播的Python成对乘法

时间:2018-04-06 22:07:09

标签: python tensorflow numpy-broadcasting vector-multiplication

我有1 * n

形状的单热矢量
v= [0.0, 1.0, 0.0] for n = 3

和形状n * m * r的矩阵为(m和r可以是任意数,但第一个维数为n)

m = [[[1,2,3,],[4,5,6]], [[5,6,7],[7,8,9]], [[2,4,7],[1,8,9]]]

我想使用广播机制将a * b多个,使得只有与向量v中的 1.0 元素对应的子矩阵保持在v * m和所有其他子矩阵的乘法中变为零(因为所有其他元素在v中为零)为:

prod = [[[0,0,0],[0,0,0]], [[5,6,7],[7,8,9]] , [[0,0,0],[0,0,0]]]

1 个答案:

答案 0 :(得分:0)

在Tensorflow中,您基本上希望将额外的维度添加到维度的末尾,否则广播将发生在最后一个维度中。所以这段代码就像你想要的那样:

import tensorflow as tf

sess = tf.Session()

v= [0.0, 1.0, 0.0]
vT = tf.expand_dims( tf.expand_dims( tf.constant( v, dtype = tf.float32 ), axis = -1 ), axis = -1 )
m = [[[1,2,3],[4,5,6]], [[5,6,7],[7,8,9]], [[2,4,7],[1,8,9]]]
mT = tf.constant( m, dtype = tf.float32 )
prodT = vT * mT
#prod = [[[0,0,0],[0,0,0]], [[5,6,7],[7,8,9]] , [[0,0,0],[0,0,0]]]

sess.run( prodT )

输出:

  

数组([[[0。,0.,0。],[0.,0.,0。]],[[5.,6.,7。],[7.,8,9,9 。]],[[0.,0.,0。],[0.,0.,0。]]],dtype = float32)