PyTorch 中高效提取跨维度变长索引子张量的单步实现方法

陌雪君_5512

陌雪君_5512

2026-07-05

182人浏览

原创

PyTorch 中高效提取跨维度变长索引子张量的单步实现方法

本文介绍如何仅用一次张量操作,从三维张量中按行分别提取不同起始位置、相同长度的切片(如第0行取索引5–9、第1行取10–14),避免分步索引+拼接,提升性能与代码简洁性。

本文介绍如何仅用一次张量操作,从三维张量中按行分别提取不同起始位置、相同长度的切片(如第0行取索引5–9、第1行取10–14),避免分步索引+拼接,提升性能与代码简洁性。

在 PyTorch 中,当需要从高维张量中按样本(即沿某维度)差异化地提取固定长度的连续子序列时(例如:对 batch 中每个样本独立指定起始索引,截取相同长度的 slice),若采用 arr[indices] 后再逐个切片并 torch.cat,不仅代码冗余,还引入中间张量和显式循环逻辑,不利于向量化与 GPU 利用率优化。

核心思路是:将“每行不同起始点 + 固定长度”的索引需求,转化为一个二维索引网格(shape: [N, L]),再通过 torch.gather 沿指定维度完成批量收集。

以原始问题为例:

import torch

arr = torch.randint(0, 9, (100, 50, 3))  # shape: [100, 50, 3]
indices = torch.tensor([5, 55])           # 选第5和第55个样本 → shape: [2]
start_offsets = torch.tensor([5, 10])      # 第0个样本从 idx=5 开始,第1个从 idx=10 开始
length = 5                                 # 每个样本取5个连续元素(即 5:10 和 10:15)

✅ 正确的单步实现如下:

PyTorch Linux版 2.11.0
PyTorch Linux版 2.11.0

PyTorch 2.11.0 历史版本下载,来自 PyPI 官方发布,适合旧项目兼容、实验复现和指定环境安装。

下载
# Step 1: 构建相对偏移量(0 到 length-1)
rel_idx = torch.arange(length, device=arr.device)  # [0, 1, 2, 3, 4]

# Step 2: 广播生成绝对索引矩阵:shape [N, length]
# start_offsets[:, None] → [[5], [10]], rel_idx[None, :] → [[0,1,2,3,4]]
abs_idx = start_offsets[:, None] + rel_idx[None, :]  # shape: [2, 5]

# Step 3: 扩展至目标维度(适配最后一维 channel=3)
# gather 要求 index 与 input 在非 gather 维度上 shape 一致
# 这里沿 dim=1 gather,故 abs_idx 需扩展为 [2, 5, 1],再广播为 [2, 5, 3]
abs_idx_exp = abs_idx.unsqueeze(-1).expand(-1, -1, arr.size(-1))  # [2, 5, 3]

# Step 4: 先取样本子集,再 gather
partial_arr = arr[indices]  # shape: [2, 50, 3]
final_result = torch.gather(partial_arr, dim=1, index=abs_idx_exp)  # shape: [2, 5, 3]

print(final_result.shape)  # torch.Size([2, 5, 3])

? 关键说明:

  • torch.gather(input, dim, index) 要求 index 的 shape 与 input 在除 dim 外的所有维度上严格匹配;index[i][j][k] 表示在 input 的 dim 维上取第 index[i][j][k] 个元素。
  • 此处 dim=1(即 50 维),因此 abs_idx_exp 必须为 [2, 5, 3] —— 前两维对应 partial_arr 的 [2, 50],最后一维 3 由 expand 自动广播,确保每个通道都使用相同的行内索引。
  • 若需最终合并为 [10, 3] 形状(即取消 batch 维),可追加 final_result.view(-1, 3)。

⚠️ 注意事项:

  • 该方法要求所有行提取长度一致(即 length 固定),否则无法构造统一 shape 的 index 张量;
  • 索引值必须在有效范围内(0 ≤ abs_idx
  • 对于不规则长度需求(如每行长度不同),应改用 torch.nn.utils.rnn.pad_packed_sequence 或自定义 torch.vmap(PyTorch 2.0+)方案。

此技巧广泛适用于序列标注、动态窗口采样、Batch 内局部注意力掩码构建等场景,在保持计算图完整性和 GPU 友好性的同时,显著提升索引操作的表达力与执行效率。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

pytorch

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1591

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3804

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1589

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

21957

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2707

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2747

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1103

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2123

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程