Select 矩阵或张量中的项目使用一维索引数组在 torch 中获取一维或二维张量

Select items from a matrix or tensor using 1-D array of indexes to get 1D or 2D tensors in torch

我有一个 n 采样预测的张量。在此示例中,我对 (10,2) 结果进行了 4 次采样,其中该结果表示一批图形,每个图形具有 3+4+3=10 个节点和 2 个坐标。我有办法 select 每个图表的最佳样本,并且我有一个索引告诉我这一点 (idx_test)。我想以一种有效的方式 select 采样张量的元素。我发现的最好方法是这样的(玩具代码示例):

rand_test = torch.randint(3, 10, (4, 10, 2))
idx_test = torch.LongTensor([0, 3, 1])

n_nodes = [3, 4, 3]

final_tensor = torch.zeros((10, 2))
accum_nodes = torch.cumsum(torch.LongTensor(n_nodes), 0)
# First iteration is done outside the for loop
final_tensor[:accum_nodes[0]] = rand_test[idx_test[0],:accum_nodes[0],:]
for i, idx in enumerate(idx_test):
    final_tensor[accum_nodes[i-1]:accum_nodes[i]] = rand_test[idx,accum_nodes[i-1] :accum_nodes[i], :]
print(final_tensor)

objective 是在不使用 for 循环的情况下获得相同的最终张量,因为在我的模型中这个数组很大

谢谢!

您可以创建一个辅助张量,其中包含要索引 rand_test 的节点索引范围。在您的示例中,您有:i=0 您有 3 个节点,索引值为 0i=14,索引值为 3,而 i=23 索引值为 1.

您可以使用 repeat_interleave:

>>> idx_test.repeat_interleave(torch.tensor(n_nodes))
tensor([0, 0, 0, 3, 3, 3, 3, 1, 1, 1])

然后索引 rand_test 使用 idxrange:

>>> final_tensor = rand_test[idx, range(len(idx))]
tensor([[5, 5],
        [7, 3],
        [8, 4],
        [7, 5],
        [7, 6],
        [7, 8],
        [9, 9],
        [7, 7],
        [8, 7],
        [3, 7]])