由于我需要重复特定的轴,我希望尽可能避免不必要的内存重新分配。
例如,给定形状(3,4,5)的numpy数组A
,我想创建一个名为B
的形状(3,4,100,5)的视图原A
。 A
的第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方法可以有效地做到这一点?
答案 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。