0

0

PyTorch 高级索引:使用不等长索引列表高效批量赋值

聖光之護

聖光之護

发布时间:2026-02-16 14:07:16

|

548人浏览过

|

来源于php中文网

原创

PyTorch 高级索引:使用不等长索引列表高效批量赋值

本文详解如何在 pytorch 中避免显式 for 循环,利用 flatten() + 列表推导式或 scatter_ 实现对二维张量按行、不等长索引列表的高效原地赋值。

本文详解如何在 pytorch 中避免显式 for 循环,利用 flatten() + 列表推导式或 scatter_ 实现对二维张量按行、不等长索引列表的高效原地赋值。

在 PyTorch 中,当需要根据每行独立的、长度不一的列索引列表(如 list_of_indices = [[], [2,3], [1], ...])对二维张量进行批量赋值时,直接使用高级索引(如 x[rows, cols])会因维度不匹配而报错——这是因为 PyTorch 要求索引张量在广播维度上形状兼容,而空列表或变长子列表无法构成合法的张量结构。

最简洁高效的解决方案是将二维张量展平为一维,再将原始行列索引统一转换为全局线性索引。假设输入张量 x 形状为 (n, m),第 i 行中需修改的列为 j₀, j₁, ..., jₖ₋₁,则对应的一维索引为 i * m + j₀, i * m + j₁, ..., i * m + jₖ₋₁。

以下为完整实现示例:

import torch

n, m = 9, 4
x = torch.arange(0, n * m).reshape(n, m)
list_of_indices = [
    [],         # row 0: no change
    [2, 3],     # row 1: set col 2, 3 → indices 1*4+2=6, 1*4+3=7
    [1],        # row 2: set col 1 → index 2*4+1=9
    [],
    [],
    [],
    [0, 1, 2, 3], # row 6: all cols → 6*4+0 to 6*4+3 = 24–27
    [],
    [0, 3],     # row 8: set col 0, 3 → 8*4+0=32, 8*4+3=35
]

# ✅ 方法一:flatten + 线性索引(推荐,简洁、原地、内存友好)
linear_indices = torch.tensor([
    i * m + j 
    for i, cols in enumerate(list_of_indices) 
    for j in cols
])
x.flatten()[linear_indices] = -1

print(x)

输出与循环版本完全一致,且全程无显式 Python 循环,所有计算由底层 CUDA/TensorRT(若启用)加速。

360智图
360智图

AI驱动的图片版权查询平台

下载

⚠️ 注意事项:

  • x.flatten() 返回的是视图(view)而非副本(只要 x 是连续存储的,而 torch.arange(...).reshape(...) 默认满足),因此赋值操作是原地的(in-place),无需重新赋值回 x;
  • 若 x 非连续(如经转置、窄切片后),请先调用 x.contiguous() 再 flatten(),否则可能触发隐式拷贝或报错;
  • linear_indices 必须为一维 torch.Tensor(dtype 通常为 torch.long),不能是 Python list 或嵌套结构。

✅ 方法二:使用 torch.scatter_(更通用,适合非原地场景或需链式调用)

x_flat = x.flatten()
x_flat.scatter_(0, linear_indices, -1)  # 原地修改 x_flat
x = x_flat.view_as(x)  # 恢复原始形状(view_as 安全,因 shape 匹配)

scatter_ 在语义上更明确表示“向指定位置散射值”,适用于更复杂场景(如多值聚合、不同填充策略),但本例中比方法一略冗长。

? 总结:对于“按行不等长索引赋值”这一高频需求,优先采用 flatten() + 列表推导生成线性索引 的组合。它兼具性能(纯张量运算)、可读性(逻辑直白)和安全性(原地、零拷贝)。避免尝试将 list_of_indices 强行转为不规则张量(如 torch.nn.utils.rnn.pad_sequence),那会引入不必要的 padding 和掩码开销,得不偿失。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

47

2025.09.03

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

144

2023.12.07

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官方网站,实现便捷、安全的网页端浏览与账号登录体验。

316

2026.02.13

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

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

126

2026.02.13

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

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

45

2026.02.13

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

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

19

2026.02.13

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

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

23

2026.02.13

热门下载

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

精品课程

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

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