0

0

PyTorch 高级索引:高效实现每行不等长索引的批量赋值

霞舞

霞舞

发布时间:2026-02-16 10:55:05

|

948人浏览过

|

来源于php中文网

原创

PyTorch 高级索引:高效实现每行不等长索引的批量赋值

本文详解如何在 PyTorch 中避免 for 循环,使用向量化方式对二维张量按“每行独立索引列表”进行原地赋值(如设为 -1),核心是将二维索引展平为一维线性索引并利用 x.flatten()[indices] 实现高效更新。

本文详解如何在 pytorch 中避免 for 循环,使用向量化方式对二维张量按“每行独立索引列表”进行原地赋值(如设为 -1),核心是将二维索引展平为一维线性索引并利用 `x.flatten()[indices]` 实现高效更新。

在 PyTorch 中,当需要对二维张量(如形状为 [n, m])的每行按不同长度的列索引列表进行批量修改(例如置为 -1)时,直观的 for 循环虽可读性强,但无法发挥 GPU 并行优势,且在大规模数据或训练循环中成为性能瓶颈。问题本质在于:PyTorch 的高级索引要求索引张量维度对齐,而 list_of_indices 是不规则嵌套结构(含空列表),无法直接与 torch.arange(n) 广播匹配。

✅ 推荐方案:展平 + 线性索引(高效、简洁、原地)

最直接且高效的方式是将二维坐标 (i, j) 映射为一维线性索引 i * m + j,再对展平后的张量进行索引赋值:

import torch

n, m = 9, 4
x = torch.arange(0, n * m).reshape(n, m)
list_of_indices = [
    [], [2, 3], [1], [], [], [], [0, 1, 2, 3], [], [0, 3]
]

# 步骤1:生成所有目标位置的一维线性索引
indices = torch.tensor([
    i * m + j 
    for i, row_indices in enumerate(list_of_indices) 
    for j in row_indices
])

# 步骤2:对展平张量执行向量化赋值(原地操作,不拷贝)
x.flatten()[indices] = -1

print(x)

输出与原始 for 循环完全一致,但全程无 Python 循环,全部在 CUDA 张量上完成(若 x 在 GPU 上,indices 也需 .to(x.device))。

⚠️ 注意事项:

芦笋演示
芦笋演示

一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。

下载
  • x.flatten() 返回的是视图(view),不是副本,因此 x.flatten()[indices] = -1 是真正的原地修改,等价于 x.view(-1)[indices] = -1;
  • 若 list_of_indices 极大,列表推导式可能影响 Python 层性能,此时建议改用 torch.cat 拼接预计算的索引张量(见进阶优化);
  • 索引必须在合法范围内(0 ≤ i*m+j

? 替代方案:torch.scatter_(功能强大,但稍冗余)

scatter_ 支持按索引散列写入,适用于更复杂的场景(如多值写入、冲突策略),但本例中略显繁琐:

flat_x = x.flatten()
flat_x.scatter_(0, indices, -1)  # 原地修改
x = flat_x.view_as(x)  # 恢复原始形状

注意:scatter_ 不支持直接链式调用 view_as(因 scatter_ 返回 self),需分步;且若 indices 含重复值,后写入会覆盖先写入(默认行为)。

? 进阶技巧:避免 Python 列表推导(纯张量化)

对于超大规模索引,可完全避免 Python 层循环,用 torch 原语构建:

# 假设 list_of_indices 已转为填充后的张量(如用 -1 填充空位),但通常不必要
# 更实用的是:预先缓存 indices 张量(尤其在训练中索引模式固定时)
# indices = torch.load("precomputed_indices.pt")  # 预计算+持久化

✅ 总结

方案 是否原地 是否 GPU 友好 代码简洁度 推荐场景
x.flatten()[indices] = val ⭐⭐⭐⭐⭐ 默认首选,简单、高效、易调试
scatter_ + view_as ⭐⭐☆ 需要 scatter 特性(如 reduce='add')时
Python for 循环 ❌(CPU-bound) ⭐⭐⭐ 调试、索引极稀疏且规模极小时

牢记核心思想:不规则二维索引 → 映射为规则一维索引 → 展平张量向量化操作。这不仅是解决本问题的关键,也是掌握 PyTorch 高级索引范式的基石。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

445

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

27

2025.12.22

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

100

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

34

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

14

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

19

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

27

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

11

2026.02.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号