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
个节点,索引值为 0
,i=1
有 4
,索引值为 3
,而 i=2
有 3
索引值为 1
.
您可以使用 repeat_interleave
:
>>> idx_test.repeat_interleave(torch.tensor(n_nodes))
tensor([0, 0, 0, 3, 3, 3, 3, 1, 1, 1])
然后索引 rand_test
使用 idx
和 range
:
>>> 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]])
我有一个 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
个节点,索引值为 0
,i=1
有 4
,索引值为 3
,而 i=2
有 3
索引值为 1
.
您可以使用 repeat_interleave
:
>>> idx_test.repeat_interleave(torch.tensor(n_nodes))
tensor([0, 0, 0, 3, 3, 3, 3, 1, 1, 1])
然后索引 rand_test
使用 idx
和 range
:
>>> 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]])