You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中如何根据类别张量索引对应向量生成目标张量?

PyTorch实现索引匹配取值方案

你需要的功能可以通过torch.gather或者PyTorch高级索引实现,torch.scatter是反向的散射操作,确实不匹配你的需求。

实现逻辑

核心是按照A张量每个位置的类别索引,从B张量对应batch的两个类别向量中取出对应向量,填充到输出的对应空间位置。

代码示例

方法1:使用高级索引(更直观)

import torch

# 定义张量维度参数
B, H, W, D = 2, 3, 4, 8

# 构造测试输入
A = torch.randint(0, 2, (B, H, W)) # BxHxW的类别索引
B_tensor = torch.randn(B, 2, D) # Bx2xD的类别向量,此处避免和变量名B冲突重命名为B_tensor

# 实现索引取值 + 维度调整
result = B_tensor[torch.arange(B, device=A.device)[:, None, None], A].permute(0, 3, 1, 2)

# 验证输出形状,结果为 torch.Size([2, 8, 3, 4]),符合BxDxHxW要求
print(result.shape)

方法2:使用torch.gather(更适合多维度扩展场景)

# 调整B的维度顺序为 BxDx2
B_reshaped = B_tensor.permute(0, 2, 1)
# 扩展A的维度为BxDxHxW,作为索引(用expand无需额外复制内存)
A_index = A.unsqueeze(1).expand(-1, D, -1, -1)
# 沿最后一个维度按索引取值
result = B_reshaped.gather(dim=2, index=A_index)

print(result.shape)

两种方法的输出结果完全一致,你可以根据自己的使用场景选择。

内容的提问来源于stack exchange,提问作者singa1994

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:01