是否有一个相当于numpy“broadcast_to”方法的theano操作?

时间:2016-10-13 07:19:08

标签: numpy theano broadcast

由于我需要重复特定的轴,我希望尽可能避免不必要的内存重新分配。

例如,给定形状(3,4,5)的numpy数组A,我想创建一个名为B的形状(3,4,100,5)的视图原AA的第3轴重复100次。

在numpy中,这可以像这样实现:

    B=numpy.repeat(A.reshape((3, 4, 1, 5)), repeats=100, axis=2)

或:

    B=numpy.broadcast_to(A.reshape((3, 4, 1, 5)), repeats=100, axis=2)

前者分配一个新内存,然后做一些复制内容,而后者只是在A上创建一个视图,而无需额外的内存重新分配。这可以通过答案Size of numpy strided array/broadcast array in memory?中描述的方法来识别。

然而,在theano中,theano.tensor.repeat似乎是唯一的方式,当然这不是首选。

我想知道是否有一个`numpy.broadcast_to'就像theano方法可以有效地做到这一点?

1 个答案:

答案 0 :(得分:0)

有一个很好的方法dimshuffle,它使theano变量可以在某个维度上播放

+--------------------+---------+
|           key      |    value|
+--------------------+---------+
|     studentNo01,a  |       1 |
+--------------------+---------+
|     studentNo01,b  |       1 |
+--------------------+---------+
|     studentNo01,c  |       1 | 
+--------------------+---------+
|     studentNo01,x  |       0 | 
+--------------------+---------+
|     studentNo01,y  |       0 | 
+--------------------+---------+
|     studentNo01,z  |       0 | 
+--------------------+---------+
|     studentNo02,c  |       1 | 
+--------------------+---------+
|     studentNo02,d  |       1 | 
+--------------------+---------+
|     studentNo02,v  |       0 | 
+--------------------+---------+
|     studentNo02,w  |       0 | 
+--------------------+---------+

现在你已经有一个形状的张量变量(3,4,' x',5),其中' x'表示您要添加的任何维度。

At = theano.tensor.tensor3()
Bt = At.dimshuffle(0,1,'x',2)

实施例

Ct=theano.tensor.zeros((Bt.shape[0],Bt.shape[1],100,Bt.shape[3]))+Bt

(3,4,1,5)

(3,4,100,5)

除非另有说明,否则最好使用变量Bt。