2017-06-16 31 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))) 

這是醜陋!

+0

'numpy'有'tile'和'repeat'。使用它們可能需要'M [無,...]' – hpaulj

+0

您可能只能播放它。 (我不確定PyTorch是否已經播出;最近它已被[實施](https://github.com/pytorch/pytorch/pull/1563),但我不確定它是否可用。) – user2357112

+0

還有[展開](http://pytorch.org/docs/tensors.html#torch.Tensor.expand),這有點像手動廣播。 – user2357112

回答

0

numpyrepeat更快:

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

我擴大M的尺寸,然後沿新維度重複。

0

請注意,您需要決定是否要爲擴展陣列分配新內存,或者是否僅需要原始陣列現有內存的新視圖。

在PyTorch中,這種區別產生了兩種方法expand()repeat()。前者僅創建一個關於現有張量的新視圖,其中第一個尺寸的尺寸通過將步幅設置爲0擴展到更大尺寸。任何尺寸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.tile()超過np.repeat(),因爲np.repeat()被設計爲對陣列的特定元素進行操作,而np.tile()被設計爲對整個陣列進行操作。因此,

import numpy as np 

L = 10 
N = 20 
A = np.random.rand(L,L) 
np.tile(A,(N, 1, 1))