我正在尝试使用列上的逻辑索引来切割PyTorch张量。我想要与索引向量中的1值对应的列。切片和逻辑索引都是可能的,但它们是否可以一起使用?如果是这样,怎么样?我的尝试一直在抛出无益的错误
TypeError:使用ByteTensor类型的对象索引张量。该 只支持的类型是整数,切片,numpy标量和 torch.LongTensor或torch.ByteTensor作为唯一的论据。
期望输出
C = torch.LongTensor([[1, 3], [4, 6]])
# 1 3
# 4 6
仅对列进行逻辑索引
import torch
A_log = torch.ByteTensor([1, 0, 1]) # the logical index
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[:, A_log] # Throws error
我也尝试过使用索引列表
import torch
A_idx = torch.LongTensor([0, 2]) # the index vector
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[:, A_idx] # Throws error
如果向量大小相同,则逻辑索引有效
import torch
A_log = torch.ByteTensor([1, 0, 1]) # the logical index
B = torch.LongTensor([1, 2, 3])
C = B[A_log]
如果我使用连续的索引范围,切片工作
import torch
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[:, 1:2]
我可以通过重复逻辑索引获得所需的结果,使其与我索引的张量具有相同的大小,但是我还必须重新整形输出。
import torch
A_log = torch.ByteTensor([1, 0, 1]) # the logical index
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[A_log.repeat(2, 1)] # [torch.LongTensor of size 4]
C = C.resize_(2, 2)
答案 0 :(得分:6)
我认为这是作为index_select
函数实现的,您可以尝试
import torch
A_idx = torch.LongTensor([0, 2]) # the index vector
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B.index_select(1, A_idx)
# 1 3
# 4 6
答案 1 :(得分:2)
在PyTorch 1.5.0中,用作索引的张量必须为long,byte或bool张量。
以下是作为long的张量的索引。
import torch
print(torch.__version__)
# 1.5.0
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
idx1 = torch.LongTensor([0, 2])
B[:, idx1]
# tensor([[1, 3],
# [4, 6]])
这是布尔的张量(逻辑索引):
idx2 = torch.BoolTensor([True, False, True])
B[:, idx2]
# tensor([[1, 3],
# [4, 6]])
答案 2 :(得分:0)
我尝试了这段代码,并将结果写在旁边的注释中。
import torch
arr = torch.tensor([[0,1,2],[3,4,5]])
arr = torch.arange(6).reshape((2,3))
print(arr)
# tensor([[0, 1, 2],
# [3, 4, 5]])
print(arr[1]) # tensor([3, 4, 5])
print(arr[1,1]) # tensor(4)
print(arr[1, :]) # tensor([3, 4, 5])
#print(arr[1,1,1]) # IndexError: too many indices for tensor of dimension 2
print(arr[1, [0,1]]) # tensor([3, 4])
print(arr[[0, 1],0]) # tensor([0, 3])