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

PyTorch技术问答:如何用给定排序索引重排张量

基于索引张量重排多维张量

问题说明

现有两个张量:

  • 张量A,形状为(d₀, d₁, ..., dₙ, dₙ₊₁)
  • 排序索引张量I,形状为(d₀, d₁, ..., dₙ)

需要利用I中的索引对A的指定维度进行重排:A与I的前n个维度完全一致,A的第n+1维度长度无限制,重排操作针对A的第n个维度(即I最后一个维度对应的A的维度)。

示例

当A的形状为torch.Size([8,8,4]),I的形状为torch.Size([8,8])时,需将A的倒数第二维度(从0开始计数为第1维)的元素,按照I的索引顺序重新排列。

解决方案

以下是支持任意维度张量的通用重排函数,通过调整索引张量的形状以匹配目标张量,再借助torch.gather完成重排操作:

import torch
from torch import LongTensor, Tensor

def sort_by_indices(values: Tensor, indices: LongTensor) -> Tensor:
    num_dims = indices.dim()

    # 调整索引张量形状,新增维度以匹配values的维度数量
    new_shape = tuple(indices.shape) + tuple(1 for _ in range(values.dim() - num_dims))
    # 定义各维度的重复次数,让索引张量在values的额外维度上完成复制
    repeats = tuple(1 for _ in range(num_dims)) + tuple(values.shape[num_dims:])

    # 扩展索引张量的形状,使其与values完全匹配
    repeated_indices = indices.reshape(*new_shape).repeat(*repeats)
    # 在指定维度执行gather操作,完成重排
    return torch.gather(values, num_dims - 1, repeated_indices)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:45:10