张量的索引、分片、合并以及维度调整

本文详细介绍了PyTorch中张量的索引方式,包括一维和二维张量的索引,以及.view()方法在改变张量形状中的应用。此外,还讲解了张量的分片操作,如chunk和split函数,以及张量的合并操作,如cat和stack函数,帮助理解张量在深度学习中的基本操作。
部署运行你感兴趣的模型镜像


张量的符号索引

张量也是有序序列,我们可以根据每个元素在系统内的顺序“编号”,来找出特定的元素,也就是索引。

一维张量索引

一维张量的索引过程和Python原生对象类型的索引一致,基本格式遵循`[start: end: step]

import torch
t1 = torch.arange(1, 11)
# 张量索引出来的结果还是零维张量, 而不是单独的数。要转化成单独的数,需要使用item()方法。
t1[0]  # tensor(1)
# 冒号分隔,表示对某个区域进行索引,也就是所谓的切片
t1[1: 8] # tensor([2, 3, 4, 5, 6, 7, 8])
# 第二个冒号,表示索引的间隔,在张量的索引中,step位必须大于0
t1[1: 8: 2] # tensor([2, 4, 6, 8])
# 冒号前后没有值,表示索引这个区域
t1[1: : 2]  # 从第二个元素开始索引,一直到结尾,并且每隔两个数取一个
t1[: 8: 2]  # 从第一个元素开始索引到第9个元素(不包含),并且每隔两个数取一个

二维张量索引

二维张量的索引逻辑和一维张量的索引逻辑基本相同,二维张量可以视为两个一维张量组合而成,而在实际的索引过程中,需要用逗号进行分隔,分别表示对哪个一维张量进行索引、以及具体的一维张量的索引。

import torch
t2 = torch.arange(1, 10).reshape(3, 3)
t2[0, 1]    # 表示索引第一行、第二个(第二列的)元素
t2[0, ::2]                # 表示索引第一行、每隔两个元素取一个
t2[::2, ::2]              # 表示每隔两行取一行、并且每一行中每隔两个元素取一个
t2[[0, 2], 1]              # 索引第一行、第三行、第二列的元素

tensor.view()方法

PyTorch中的.view()方法。该方法会返回一个类似视图的结果,该结果和原张量对象共享一块数据存储空间,并且通过.view()方法,还可以改变对象结构,生成一个不同结构,但共享一个存储空间的张量。当然,共享一个存储空间,也就代表二者是“浅拷贝”的关系,修改其中一个,另一个也会同步进行更改。

t = torch.arange(6).reshape(2, 3)
te = t.view(3, 2)              # 构建一个数据相同,但形状不同的“视图”
tr = t.view(1, 2, 3)           # 维度也可以修改

“视图”的作用就是节省空间,而值得注意的是,很多切分张量的方法中,返回结果都是“视图”,而不是新生成一个对象。

张量的分片函数

分块:chunk函数

chunk函数能够按照某维度,对张量进行均匀切分,并且返回结果是原张量的视图。

t2 = torch.arange(12).reshape(4, 3)
tc = torch.chunk(t2, 4, dim=0)           # 在第零个维度上(按行),进行四等分
# 当原张量不能均分时,chunk不会报错,但会返回其他均分的结果
torch.chunk(t2, 3, dim=0)            # 次一级均分结果

拆分:split函数

split既能进行均分,也能进行自定义切分。当然,需要注意的是,和chunk函数一样,split返回结果也是view。

t2 = torch.arange(12).reshape(4, 3)
torch.split(t2, 2, 0)  # 第二个参数只输入一个数值时表示均分,第三个参数表示切分的维度
torch.split(t2, [1, 3], 0)  # 第二个参数输入一个序列时,表示按照序列数值进行切分,也就是1/3分
# 注意,当第二个参数位输入一个序列时,序列的各数值的和必须等于对应维度下形状分量的取值。
torch.split(t2, [1, 1, 2], 0) 
ts = torch.split(t2, [1, 2], 1) 

张量的合并操作

张量的合并操作类似与列表的追加元素,可以拼接、也可以堆叠。

拼接函数:cat

PyTorch中,可以使用cat函数实现张量的拼接。
注意理解,拼接的本质是实现元素的堆积,也就是构成a、b两个二维张量的各一维张量的堆积,最终还是构成二维向量。

a = torch.zeros(2, 3)
b = torch.ones(2, 3)
torch.cat([a, b])                  # 按照行进行拼接,dim默认取值为0
torch.cat([a, b], 1)               # 按照列进行拼接

堆叠函数:stack

和拼接不同,堆叠不是将元素拆分重装,而是简单的将各参与堆叠的对象分装到一个更高维度的张量里。

a = torch.zeros(2, 3)
b = torch.ones(2, 3)
torch.stack([a, b])  # 堆叠之后,生成一个三维张量
torch.stack([a, b]).shape

注意对比二者区别,拼接之后维度不变,堆叠之后维度升高。拼接是把一个个元素单独提取出来之后再放到二维张量中,而堆叠则是直接将两个二维张量封装到一个三维张量中,因此,堆叠的要求更高,参与堆叠的张量必须形状完全相同。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 张量索引的概念与用法 张量是一种多维数组结构,在深度学习框架如 PyTorch 和 TensorFlow 中被广泛使用。以下是关于张量索引的具体说明: #### 1. **NumPy 的索引** 在 NumPy 中,可以像处理 Python 列表一样对数组进行索引和切片操作。例如: ```python import numpy as np numpy_array = np.array([[1, 2, 3], [4, 5, 6]]) print(numpy_array[0, 1]) # 输出:2 ``` 这里 `numpy_array[0, 1]` 表示访问第 0 行第 1 列的元素[^1]。 #### 2. **TensorFlow 的张量索引** TensorFlow 提供了类似的索引功能,可以直接通过方括号 `[ ]` 访问张量中的特定位置。例如: ```python import tensorflow as tf tensor = tf.constant([[1, 2, 3], [4, 5, 6]]) print(tensor[0, 1].numpy()) # 输出:2 ``` 上述代码展示了如何从二维张量中提取单个元素。 #### 3. **PyTorch 的张量索引** PyTorch 支持更灵活的高级索引方式,允许使用布尔掩码或整数列表来选择子集。例如: ```python import torch a = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 基本索引 print(a[0, 1]) # 输出:2 # 高级索引 (按条件筛选) mask = a > 3 print(a[mask]) # 输出:tensor([4, 5, 6]) # 整数列表索引 rows = torch.tensor([0, 1]) cols = torch.tensor([1, 2]) print(a[rows, cols]) # 输出:tensor([2, 6]) ``` 这些例子演示了基本索引以及基于条件和整数列表的选择方法[^2]。 #### 4. **张量切片** 除了简单的索引外,还可以通过对多个维度应用范围来进行切片操作。例如: ```python b = torch.arange(16).reshape((4, 4)) print(b[:, :2]) # 所有行的第一列到第二列 print(b[:2, :]) # 前两行的所有列 ``` 以上代码片段分别实现了全选部分列和部分行的操作[^3]。 #### 总结 无论是 NumPy 还是深度学习库中的张量对象,其核心理念都是围绕着高效的数据存取机制展开设计。掌握好基础语法有助于更好地构建复杂的模型架构或者执行数据预处理任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值