2017-04-15 3 views
0

Je souhaite supprimer des colonnes tensorielles par un tableau ou un tenseur d'indices. Par exemple:Torch: supprimer les colonnes tensorielles par indices

th> X = torch.rand(2,4) 

th> X 
0.7475 0.2512 0.6085 0.6414 
0.7143 0.8299 0.2929 0.6945 
[torch.DoubleTensor of size 2x4] 

th> indices = torch.zeros(2) 

th> indices[1] = 1 

th> indices[2] = 3 

th> indices 
1 
3 
[torch.DoubleTensor of size 2] 

th> X:delete(indices) 
0.2512 0.6414 
0.8299 0.6945 

Répondre

3

Étrangement, il n'y a pas de fonction intégrée pour cela. Ce n'est pas une opération banale, cependant. Les tenseurs de torche ne stockent pas nécessairement leurs nombres de manière contiguë, mais ils doivent absolument les stocker de façon périodique, c'est-à-dire que la foulée doit être constante le long de la dimension.

Si vous avez besoin d'un tenseur sans quelques colonnes ou des lignes, moyen le plus simple est d'utiliser index:

x=torch.Tensor{{1,2,3,4,},{5,6,7,8,}} 
y=x:index(2,torch.LongTensor{1,3,4}) 
--return: 
    1 3 4 
    5 7 8 

Ce retourne copie du tenseur d'origine car il n'y a aucun moyen efficace de garder une trace de tous les les éléments qui devraient être sautés.

Si vous ne souhaitez pas utiliser la mémoire supplémentaire, peut se débarrasser d'une colonne en utilisant des tranches et views:

x[{{},{2,3}}]=x[{{},{3,4}}] 
x=x:view(2,3) 

Cela implique des déplacements dans toutes les données derrière la colonne supprimée. Si vous souhaitez en supprimer plusieurs, des optimisations peuvent être implémentées. Cela ne réduit pas la mémoire utilisée par un tableau. Pour autant que je sache, il est impossible de réduire l'utilisation de la mémoire sans déplacer les données nécessaires vers un nouveau stockage.