Yes, you can directly slice it using the index and then use torch.unsqueeze() to promote the 2D tensor to 3D:
# inputs In [6]: tensor = torch.rand(12, 512, 768) In [7]: idx_list = [0,2,3,400,5,32,7,8,321,107,100,511] # slice using the index and then put a singleton dimension along axis 1 In [8]: for idx in idx_list: ...: sampled_tensor = torch.unsqueeze(tensor[:, idx, :], 1) ...: print(sampled_tensor.shape) ...: torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768])
Alternatively, if you want it even more terse code and don't want to use torch.unsqueeze(), then use:
In [11]: for idx in idx_list: ...: sampled_tensor = tensor[:, [idx], :] ...: print(sampled_tensor.shape) ...: torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768]) torch.Size([12, 1, 768])
Note: there's no need to use a for loop if you wish to do this slicing only for one idx from idx_list