Попарно умножение Python с использованием трансляции в первом измерении
У меня есть горячий вектор формы 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, используя механизм широковещания, такой, что только подматрица, соответствующая 1.0 элементу в векторе v, сохраняется в умножении v * m, и все другие подматрицы становятся равными нулю (потому что все другие элементы равны нулю в v) как:
prod = [[[0,0,0],[0,0,0]], [[5,6,7],[7,8,9]] , [[0,0,0],[0,0,0]]]
1 ответ
Решение
В 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.]], [[0., 0., 0.], [0., 0., 0.]]], dtype=float32)