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

PyTorch如何判断张量A前k大元素索引匹配张量B的argmax索引

错误原因

你的代码问题出在torch.any(top_idx, 1)的使用逻辑完全错误:

  • torch.any()作用是对布尔张量沿指定维度判断是否存在True,当输入为整数张量时,会自动将所有非0值识别为True、0值识别为False,返回的是对应维度下是否有非0值的布尔结果,根本不是你想要的「判断真实索引是否在topk索引列表中」的逻辑。
  • 以示例第一行为例:top_idx是[2, 1],torch.any(top_idx, 1)返回True(对应整数值1),而该行真实索引是2,1 == 2不成立,所以第一行被误判为不匹配,最终只返回第二行的索引。

正确实现

思路是先将真实索引扩维后和topk索引批量比较,再逐行判断是否存在匹配:

import torch

# 示例输入
A = torch.tensor([[0.1, 0.4, 0.5],
                  [0.5, 0.4, 0.1],
                  [0.4, 0.5, 0.1]])
B = torch.tensor([[0, 0, 1],
                  [0, 1, 0],
                  [0, 0, 1]])
k = 2

# 1. 得到每行真实类别索引
y_true = B.argmax(dim=1)
# 2. 得到每行topk最大值的索引
top_idx = torch.topk(A, k, dim=1).indices
# 3. 扩维后批量比较,逐行判断是否存在匹配
is_match = (top_idx == y_true.unsqueeze(1)).any(dim=1)
# 4. 提取匹配的行索引
result = torch.where(is_match)[0]

print(result) # 输出 tensor([0, 1])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:54:01