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

PyTorch如何对4D张量的最后两个维度执行argmax操作

4D张量最后两个维度argmax实现方案

原有代码报错原因

你的现有代码维度不匹配的核心原因:
第一次对shape为[1, 512, 37, 59]的张量在dim=2(倒数第二个维度)取最大值后,得到的indices_r维度为[1, 512, 59];第二次对max_vals在dim=2取最大值后,得到的indices_c维度为[1, 512],二者维度不一致自然无法直接拼接。

方案1:拉平最后两维后反解索引(更简洁,推荐)

这是目前最高效且不易出错的多维度argmax实现方式,适配任意前序维度的张量:

# 1. 拉平最后两个维度,得到shape为 [1, 512, 37*59] 的张量
flatten_last2 = original_array.flatten(start_dim=-2)
# 2. 对拉平后的最后一维取argmax,得到shape为 [1, 512] 的扁平化索引
flat_idx = torch.argmax(flatten_last2, dim=-1)
# 3. 将扁平化索引反解为原始最后两个维度的坐标
indices_r, indices_c = torch.unravel_index(flat_idx, shape=original_array.shape[-2:])
# 4. 可按需拼接为 [1, 512, 2] 的最终索引张量,每个位置对应 (行索引, 列索引)
indices = torch.stack([indices_r, indices_c], dim=-1)

方案2:修正原有分步取max的思路

如果你想沿用分步取最大值的逻辑,只需要补一步索引gather操作,拿到对应列位置的行索引即可:

# 第一步:沿倒数第二个维度取最大值,得到每个列位置对应的最大行索引
max_vals_col, indices_r = torch.max(original_array, dim=-2) # 输出shape均为 [1, 512, 59]
# 第二步:沿倒数第一个维度取最大值,得到全局最大的列位置
max_vals_final, indices_c = torch.max(max_vals_col, dim=-1) # 输出shape均为 [1, 512]
# 补一步:用得到的列位置,从indices_r中取出对应的行索引
indices_r_final = indices_r.gather(dim=-1, index=indices_c.unsqueeze(-1)).squeeze(-1)
# 拼接得到最终索引
indices = torch.stack([indices_r_final, indices_c], dim=-1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:36:05