2016-07-22 59 views
3

作用类似于numpy外函数的等价操作(或一系列操作)张量流中的外加和减法

import numpy as np 

a = np.arange(3) 
b = np.arange(5) 

print np.subtract.outer(a,b) 

[[ 0 -1 -2 -3 -4] 
[ 1 0 -1 -2 -3] 
[ 2 1 0 -1 -2]] 

明显的候选人tf.sub似乎只是作用于元素。

回答

4

使用广播:

sess.run(tf.transpose([tf.range(3)]) - tf.range(5)) 

输出

array([[ 0, -1, -2, -3, -4], 
     [ 1, 0, -1, -2, -3], 
     [ 2, 1, 0, -1, -2]], dtype=int32) 

更具体地,给定的(3, 1)(1, 5)阵列,广播在数学上等同于阵列平铺成匹配(3, 5)形状和操作的方式操作逐点

enter image description here

此平铺内部通过循环现有数据实现,因此不需要额外的内存。当给予(3, 1)(5)等不同等级的广播时,广播将填充更小的形状,其左边的 。这意味着像tf.range(5)这样的1D列表被视为行向量,并且相当于[tf.range(5)]

+0

感谢雅罗斯拉夫,这是完美的!这与使用'tf.tile'完全等价吗?或者这种方式使用广播效率更高? – Hooked

+0

它更高效,它并不实际复制内存中的数据,例如tile –