PyTorch 中张量索引与切片详解

使用前先导入:

import torch

1.基础索引(类似 Python / NumPy)

适用于低维张量:x[i]x[i, j]

x = torch.tensor([[10, 11, 12],[13, 14, 15],[16, 17, 18]])print(x[0])         # 第0行: tensor([10, 11, 12])
print(x[1][2])      # 第1行第2列: 15
print(x[2, 1])      # 第2行第1列: 17

2.切片(Slicing)

x = torch.arange(16).reshape(4, 4)
# tensor([[ 0,  1,  2,  3],
#         [ 4,  5,  6,  7],
#         [ 8,  9, 10, 11],
#         [12, 13, 14, 15]])print(x[:2])        # 前两行
print(x[:, 1:3])    # 所有行,第1~2列
print(x[::2, ::2])  # 行列间隔为2

3.负索引

print(x[-1])        # 最后一行
print(x[:, -2:])    # 每行最后两列

4.使用 ... (Ellipsis)

当维度很多时可简化操作。

x = torch.arange(2*3*4).reshape(2, 3, 4)# 等价于 x[0, :, 2]
print(x[0, ..., 2])

5.Noneunsqueeze 增加维度

x = torch.tensor([1, 2, 3])# 增加维度(等价于 unsqueeze)
print(x[None, :].shape)     # torch.Size([1, 3])
print(x[:, None].shape)     # torch.Size([3, 1])

6. 布尔索引(Boolean Indexing)

x = torch.tensor([10, 20, 30, 40])mask = x > 25
print(mask)         # tensor([False, False,  True,  True])
print(x[mask])      # tensor([30, 40])

7. 花式索引(Fancy Indexing)

使用索引列表访问多个非连续位置。

x = torch.tensor([10, 20, 30, 40, 50])idx = torch.tensor([0, 2, 4])
print(x[idx])       # tensor([10, 30, 50])

二维花式索引:

x = torch.arange(1, 10).reshape(3, 3)
# tensor([[1, 2, 3],
#         [4, 5, 6],
#         [7, 8, 9]])rows = torch.tensor([0, 1, 2])
cols = torch.tensor([2, 1, 0])
print(x[rows, cols])  # [3, 5, 7]

8. 条件赋值 / where

x = torch.tensor([1, 2, 3, 4, 5])
x[x > 3] = 100
print(x)            # tensor([  1,   2,   3, 100, 100])# 条件选择
a = torch.tensor([1, 2, 3])
b = torch.tensor([10, 20, 30])
cond = torch.tensor([True, False, True])print(torch.where(cond, a, b))  # -> [1, 20, 3]

9. 高维张量索引技巧

x = torch.arange(2*3*4).reshape(2, 3, 4)# 提取第1个 batch 所有通道第2列
print(x[0, :, 2])    # shape: (3,)

10. 实例:图像张量裁剪(HWC)

img = torch.rand((3, 256, 256))  # C, H, W 格式# 裁剪中心区域
crop = img[:, 100:200, 100:200]  # shape (3, 100, 100)

11. 总结图解(结构化索引方式)

张量索引方式:
├── 基础索引(x[i], x[i,j])
├── 切片(x[start:end], x[:, idx])
├── 高维省略(x[..., -1])
├── 增维/降维(x[None, :], x.squeeze())
├── 布尔索引(x[x>val])
├── 花式索引(x[[0, 2, 4]])
├── 条件赋值(x[x > a] = b)
└── torch.where(cond, a, b)

高级应用


1. 高级花式索引(Advanced Fancy Indexing)

基本复习:

花式索引是用整张或部分张量作为索引,获取非连续元素。进阶里,张量的形状组合、广播规则非常重要。

代码示例:

import torchx = torch.arange(27).reshape(3, 3, 3)
# x shape = (3, 3, 3)# 目标:同时选取不同 batch 不同通道的元素
idx_batch = torch.tensor([0, 1, 2])   # 每个 batch 索引
idx_channel = torch.tensor([2, 1, 0]) # 每个对应通道索引
idx_row = torch.tensor([0, 1, 2])     # 对应行索引# 三个索引张量自动广播,选出:
# x[0, 2, 0], x[1, 1, 1], x[2, 0, 2]
result = x[idx_batch, idx_channel, idx_row]print(result)  # tensor([ 6, 13, 24])
  • 关键是各个索引张量形状要匹配或可广播
  • 返回值的形状取决于索引张量的形状。

2. 坐标映射索引(Indexing with Coordinate Tensors)

常用在点云、图像坐标映射,手工给定索引位置批量取值。

代码示例:

x = torch.arange(16).reshape(4, 4)
# tensor([[ 0,  1,  2,  3],
#         [ 4,  5,  6,  7],
#         [ 8,  9, 10, 11],
#         [12, 13, 14, 15]])# 给定坐标点
coords = torch.tensor([[0, 1], [2, 3], [3, 0]])  # 三个点的坐标rows = coords[:, 0]
cols = coords[:, 1]vals = x[rows, cols]
print(vals)  # tensor([ 1, 11, 12])

torch.gather — 按索引沿指定维度收集数据

x = torch.arange(12).reshape(3, 4)
# tensor([[ 0,  1,  2,  3],
#         [ 4,  5,  6,  7],
#         [ 8,  9, 10, 11]])indices = torch.tensor([[0, 3], [2, 1], [1, 0]])
result = torch.gather(x, dim=1, index=indices)
print(result)
# tensor([[ 0,  3],
#         [ 6,  5],
#         [ 9,  8]])
  • torch.gather 需要索引张量与输入同形状,但索引值表示该维度的选取位置。

3. 高维图像张量处理技巧

假设图像张量格式为 (Batch, Channels, Height, Width),称为 BCHW。

常用操作示例:

(a) 批量裁剪 (Crop)
img = torch.randn(5, 3, 256, 256)  # 5张RGB图像# 取中心128x128块
h_start = (256 - 128) // 2
w_start = (256 - 128) // 2crop = img[:, :, h_start:h_start+128, w_start:w_start+128]  # shape (5, 3, 128, 128)
(b) 改变通道顺序
# BCHW -> BHWC
img_bhwc = img.permute(0, 2, 3, 1)
print(img_bhwc.shape)  # (5, 256, 256, 3)
© 按坐标索引批量像素点
batch_size = 2
img = torch.arange(batch_size*3*4*4).reshape(batch_size, 3, 4, 4)# 取每张图(0,1)通道,指定像素点坐标
coords = torch.tensor([[1, 2], [3, 0]])  # (batch_size, 2) 像素坐标 (H, W)batch_indices = torch.arange(batch_size)
channels = torch.tensor([0, 1])  # 不同图不同通道pixels = img[batch_indices, channels, coords[:, 0], coords[:, 1]]
print(pixels)

总结:

技巧类别适用场景关键函数/概念
高级花式索引多维非连续索引,索引张量广播多张量索引广播
坐标映射索引点云坐标、图像点批量索引torch.gather, 坐标张量索引
高维图像张量处理批量裁剪、通道转换、批量像素选取permutereshape、多维切片

4.综合示例

下面以一个综合示例代码,涵盖 高级花式索引坐标映射索引,以及 高维图像张量处理,注释详尽,方便大家理解和直接跑起来。

import torchdef advanced_fancy_indexing():print("=== 高级花式索引示例 ===")x = torch.arange(27).reshape(3, 3, 3)idx_batch = torch.tensor([0, 1, 2])idx_channel = torch.tensor([2, 1, 0])idx_row = torch.tensor([0, 1, 2])# 选出 x[0,2,0], x[1,1,1], x[2,0,2]result = x[idx_batch, idx_channel, idx_row]print(result)  # tensor([ 6, 13, 24])print()def coordinate_mapping_indexing():print("=== 坐标映射索引示例 ===")x = torch.arange(16).reshape(4, 4)coords = torch.tensor([[0, 1], [2, 3], [3, 0]])  # 3个坐标点rows = coords[:, 0]cols = coords[:, 1]vals = x[rows, cols]print(f"从坐标 {coords.tolist()} 取值: {vals.tolist()}")# torch.gather示例x2 = torch.arange(12).reshape(3, 4)indices = torch.tensor([[0, 3], [2, 1], [1, 0]])gathered = torch.gather(x2, dim=1, index=indices)print(f"torch.gather 结果:\n{gathered}")print()def high_dim_image_tensor_processing():print("=== 高维图像张量处理示例 ===")# 生成一个 5张RGB图像 BCHW 格式img = torch.randn(5, 3, 256, 256)# 裁剪中心128x128h_start = (256 - 128) // 2w_start = (256 - 128) // 2crop = img[:, :, h_start:h_start+128, w_start:w_start+128]print(f"裁剪后的形状: {crop.shape}")# 通道顺序变换 BCHW -> BHWCimg_bhwc = img.permute(0, 2, 3, 1)print(f"通道转换后形状: {img_bhwc.shape}")# 批量取像素点batch_size = 2img_small = torch.arange(batch_size*3*4*4).reshape(batch_size, 3, 4, 4)coords = torch.tensor([[1, 2], [3, 0]])  # 每张图像的像素坐标 (H, W)batch_indices = torch.arange(batch_size)channels = torch.tensor([0, 1])  # 两张图不同通道pixels = img_small[batch_indices, channels, coords[:, 0], coords[:, 1]]print(f"批量像素值: {pixels.tolist()}")if __name__ == "__main__":advanced_fancy_indexing()coordinate_mapping_indexing()high_dim_image_tensor_processing()

代码说明

  • advanced_fancy_indexing()
    演示多张量广播索引从三维张量中选取不规则元素。

  • coordinate_mapping_indexing()
    演示给定坐标点批量取值 + 用 torch.gather 沿某维度收集。

  • high_dim_image_tensor_processing()
    展示了高维图像张量裁剪、通道排列变换和批量像素点采样。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91245.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91245.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91245.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京-4年功能测试2年空窗-报培训班学测开-第五十一天

行叭,今天复习第一天,状态效率,差我发现,一旦换了新环境/知识,我就需要重新调整状态,少则一两天,多则一周多。从周日起就很迷茫,哪怕昨天老师讲了简历与面试,我也清楚地知…

虚拟现实的镜廊:当技术成为存在之茧

傍晚,摘下VR头盔的瞬间,房间里未关的台灯竟显得刺眼。指尖划过光滑的塑料外壳,温热的机体还在微微震动,如同某种活物的呼吸。窗外城市的光污染在玻璃上晕染成片,而我的视网膜里仍残留着方才的极光:挪威峡湾…

OSPF过滤

首先需要复习一个点:ACL最终隐含规则不同:如果acl匹配的是流量,则默认是运行所有如果acl匹配的是路由,则默认是拒绝所有OSPF过滤: 1.路由过滤1.LSA可以正常学习,但是不会使用LSA计算路由[AR1]acl 2000[AR1-…

OneCode 3.0 VFS客户端驱动(SDK)技术解析:从架构到实战

引言 在分布式系统架构中,高效的文件管理一直是开发者面临的核心挑战。OneCode 3.0作为新一代微内核引擎,其VFS(虚拟文件系统)模块通过客户端驱动(SDK)提供了统一的文件操作抽象,屏蔽了底层存储细节,为开发…

@Reusable-组件复用

Reusable组件复用概述:ArkUI布局中,将自定义组件从组件树上移除后放入缓存池,后续在创建相同类型的组件节点时,直接复用缓存池中的组件对象。ArkUI中使用Reusable装饰器以实现自定义组件的复用。常见的组件复用场景是当有大量数据…

黑马点评系列问题之p63unlock.lua不知道怎么整

问题描述:这个位置的这个unlock.lua文件是怎么生成的。老师给的不是很清楚。解决右键单击resources。如图输入回车,然后界面的上方,大概是在这个位置,会有让你引入这个依赖的选项,我的已经没有了。他会出来大概三个选项…

Python爬虫实战:研究Python-Markdown库相关技术

1. 引言 在当今信息爆炸的时代,网络上存在着大量有价值的技术文章。对于技术人员来说,如何高效地收集、整理和保存这些文章是一个重要的问题。爬虫技术可以帮助我们自动从网络上获取所需的文章内容,而 Markdown 作为一种轻量级标记语言,因其简洁的语法和良好的兼容性,成为…

JAVA经典单例模式

前言单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类仅有一个实例,并提供全局访问点。它在需要控制资源(如数据库连接、配置管理)或避免重复创建对象的场景中广泛应用。一,核心概念…

20250715问答课题-基于BERT与混合检索问答系统

1. 引言构建一个基于BERT与混合检索策略的智能问答系统,通过深度学习与传统检索技术的融合,解决了心法领域知识检索中的三个关键问题:(1)专业术语的语义理解不足;(2)问答匹配精度低;(3)检索结果多样性差。2. 方法2.1. …

面向对象与面向过程、函数式编程

面向对象与面向过程、函数式编程 1. 面向过程编程(Procedure-Oriented Programming) 面向过程编程将程序视为一系列函数的集合,数据和操作数据的函数是分离的。在 Vue 3 中,这种风格通常表现为使用组合式 API(Composit…

基于大数据的淘宝用户行为数据分析系统的设计与实现

开发环境开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven…

视频人脸处理——人脸面部动作提取

文章目录基于openface实现的技术方案windows环境下使用1. 安装依赖软件2. 下载OpenFace代码3. 编译OpenFace4. 提取面部动作单元5.选择提取目标方案liunx环境下使用安装与配置使用 OpenFace 提取面部动作单元应用场景基于py-feat实现的方案1. 从HuggingFace下载模型并设置Detec…

【Docker基础】Dockerfile构建与运行流程完全指南:从原理到实践优化

目录 引言 1 docker build命令参数详解 1.1 命令概述 1.2 常用参数详解 1.2.1 -t, --tag 1.2.2 -f, --file 1.2.3 --build-arg 1.2.4 --no-cache 1.2.5 --pull 1.3 构建流程图解 2 构建上下文(Context)优化技巧 2.1 构建上下文定义 2.2 优化…

StarRocks Community Monthly Newsletter (Jun)

版本动态 v3.5.0 存算分离:支持生成列、主键表重建索引;大规模导入逻辑优化,降低小文件数量。 数据湖分析:Beta 支持 Iceberg 视图创建与修改;支持 Iceberg REST Catalog 嵌套命名空间; 性能提升与查询优…

HDMI接口 vs. DisplayPort接口:电竞玩家该如何选择更优?

在搭建游戏主机或电竞PC时,显示器接口的选择(HDMI vs. DP)会直接影响画质、刷新率和延迟表现。本文将从分辨率、刷新率、可变刷新率(VRR)、带宽、兼容性等角度对比,帮你选出最适合游戏的接口。1. 基础对比&…

论文笔记:Learning Cache Replacement with CACHEUS

2021 USENIX GitHub - sylab/cacheus: The design and algorithms used in Cacheus are described in this USENIX FAST21 paper and talk video: https://www.usenix.org/conference/fast21/presentation/rodriguez Learning Cache Replacement with CACHEUS 1 intro 基于…

极致cms多语言建站|设置主站默认语言与设置后台固定语言为中文

小记 很长时间没有建站了,最近有需求所以又回炉了,使用的极致cms 极致cms帮助文档 | 极致CMS帮助文档 由于很长时间没做,又遇到了之前碰到的两个问题,凭借经验和记忆还是处理掉了 1.当网站前台使用?len或?lzh来切换语言时,管…

Linux Vim 编辑器详解:从入门到进阶(含图示+插件推荐)

前言在 Linux 的世界中,Vim 是一款被无数开发者喜爱和追捧的强大文本编辑器。如果你厌倦了鼠标点来点去,不妨试试 Vim —— 一款专注于高效键盘操作的“终极利器”。本文将带你全面了解 Vim 的基本概念、模式切换、常用命令、窗口管理,并附上…

web前端渡一大师课 01 事件循环

一. 浏览器的进程模型 1.何为进程?程序运行需要有它自己专属的内存空间,可以把这块内存空间简单理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意 2.何为线程?有了进程后,就可以运行程序的代码了,运行代码的"人",称之为"线程&…

linux网络存储——freeNAS的安装配置

一、前言 freeNAS 是一款基于 FreeBSD 的开源网络存储操作系统,支持文件共享(如 SMB/CIFS、NFS、AFP)、数据备份、虚拟化存储等功能。同时FreeNAS开源优势明显,代码开放可自主定制,能满足多样需求。支持多种协议…