由于我需要在特定的轴上重复,因此我希望尽可能避免不必要的内存重新分配。
例如,给定一个形状为(3,4,5)的numpy数组A
,我想在原始A
上创建一个形状为(3,4,100,5)的视图B
。A
的第三轴重复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
上创建一个视图,没有额外的内存重新分配。这可以通过答案中描述的方法来识别numpy跨行数组/广播数组在内存中的大小?.
在ano,然而,theano.tensor.repeat
似乎是唯一的方法,当然它不是可取的。
我想知道是否有一个"numpy"。Broadcast_to '像ano方法可以有效地做到这一点吗?
有一个很好的方法dimshuffle,它使theano变量可以在某个维度上广播
At = theano.tensor.tensor3()
Bt = At.dimshuffle(0,1,'x',2)
现在你得到了一个形状为(3,4,'x',5)的张量变量,其中'x'表示你想添加的任何维度。
Ct=theano.tensor.zeros((Bt.shape[0],Bt.shape[1],100,Bt.shape[3]))+Bt
例子f=theano.function([At],[Bt,Ct])
A = np.random.random((3,4,5)).astype(np.float32)
B,C=f(A)
print B.shape
print C.shape
(3, 4, 1, 5)
(3, 4, 100, 5)
除非指定,否则最好使用变量Bt。