2017-06-16 12 views
0

私はPython/Pytorchユーザです。まず、numpyで、LxLの配列Mを持っていて、次のような配列を持ちたいとします:A =(M、...、M)の大きさ、例えばNxLxLはよりエレガントで/メモリ効率的な方法:配列/トーチテンソルのコピーを効率的に積み重ねることはできますか?

A=np.array([M]*N) ? 

トーチテンソルと同じ質問! Mは、変数(torch.tensor)であれば 原因は、今、私がしなければならない。

A=torch.autograd.Variable(torch.tensor(np.array([M]*N))) 

醜いです! numpyrepeat

+0

「numpy」には「タイル」と「リピート」があります。それらを使うと 'M [None、...] 'が必要になるかもしれません。 – hpaulj

+0

あなたはただそれを放送することができます。 (私はPyTorchがまだ放送しているかどうかは確かではないが、最近(実装されている)(https://github.com/pytorch/pytorch/pull/1563)、利用可能かどうかはわからない。 – user2357112

+0

[ expand](http://pytorch.org/docs/tensors.html#torch.Tensor.expand)のような手動放送のようなものです。 – user2357112

答えて

0

は速いです:

np.repeat(M[None,...], N,0) 

私はMの寸法を展開し、その新たな次元に沿って繰り返します。

0

拡張配列に新しいメモリを割り当てるかどうか、または元の配列の既存のメモリの新しいビューを必要とするかどうかを決定する必要があることに注意してください。

PyTorchでは、この区別によって2つの方法expand()repeat()が発生します。前者は、ストライドを0に設定することで、サイズ1のディメンションがより大きなサイズに展開される既存のテンソルの新しいビューを作成します。新しいメモリを割り当てることなく、サイズ1の任意のディメンションを任意の値に展開できます。対照的に、後者は元のデータをコピーし、新しいメモリを割り当てる。次のように

PyTorchでは、あなたの目的のためにexpand()repeat()を使用することができます。

import torch 

L = 10 
N = 20 
A = torch.randn(L,L) 
A.expand(N, L, L) # specifies new size 
A.repeat(N,1,1) # specifies number of copies 

はnumpyのは、あなたがよりエレガントかつ効率的な方法で上記のやったことを達成するための多くの方法があります。あなたの特定の目的のために、np.repeat()を超えてnp.tile()をお勧めします。np.repeat()は配列の特定の要素を操作するように設計されており、np.tile()は配列全体を操作するように設計されています。したがって、

import numpy as np 

L = 10 
N = 20 
A = np.random.rand(L,L) 
np.tile(A,(N, 1, 1)) 
関連する問題