2017-06-16 4 views
0

Je suis un utilisateur de Python/Pytorch. Tout d'abord, en numpy, disons que j'ai un tableau M de taille LxL, et je veux avoir le tableau suivant: A = (M, ..., M) de taille, disons, NxLxL, y at-il un plus élégant/mémoire efficace de le faire que:Empiler efficacement des copies d'un tableau/d'un tenseur de torche?

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

Même question avec le tenseur de la torche! cause, maintenant, si M est une variable (torch.tensor), je dois faire:

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

qui est laid!

+0

'numpy' a' tile' et 'repeat'. Les utiliser peut nécessiter 'M [Aucun, ...]' – hpaulj

+0

Vous pourrez peut-être simplement le diffuser. (Je ne sais pas si PyTorch a déjà diffusé, il a été [implémenté] (https://github.com/pytorch/pytorch/pull/1563) récemment, mais je ne suis pas sûr qu'il soit disponible.) – user2357112

+0

Il y a aussi [ expand] (http://pytorch.org/docs/tensors.html#torch.Tensor.expand), qui est un peu comme la diffusion manuelle. – user2357112

Répondre

0

En numpyrepeat est plus rapide:

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

J'élargissons les dimensions du M, puis répéter le long de cette nouvelle dimension. Notez que vous devez décider si vous souhaitez allouer de la nouvelle mémoire pour votre tableau étendu ou si vous avez simplement besoin d'une nouvelle vue de la mémoire existante du tableau d'origine.

0

Dans PyTorch, cette distinction donne lieu aux deux méthodes expand() et repeat(). La première crée uniquement une nouvelle vue sur le tenseur existant où une dimension de taille un est étendue à une taille plus grande en définissant la foulée sur 0. Toute dimension de taille 1 peut être étendue à une valeur arbitraire sans allocation de nouvelle mémoire. En revanche, ce dernier copie les données d'origine et alloue une nouvelle mémoire.

En PyTorch, vous pouvez utiliser expand() et repeat() comme suit pour vos besoins:

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 

En Numpy, il y a une multitude de façons de réaliser ce que vous avez fait ci-dessus d'une manière plus élégante et efficace. Pour votre usage particulier, je recommande np.tile() sur np.repeat(), puisque np.repeat() est conçu pour fonctionner sur les éléments particuliers d'un tableau, tandis que np.tile() est conçu pour fonctionner sur l'ensemble de la baie. Par conséquent,

import numpy as np 

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