7 张量的索引与切片

在上一篇中,我们介绍了张量的基本操作,如张量的创建、数据类型和一些常用的操作。如今,我们将深入探讨张量的索引与切片,这将帮助我们更灵活地处理数据。掌握这一部分的知识,可以为后续学习自动求导奠定坚实的基础。

张量的索引

在PyTorch中,张量的索引与NumPy基本相似。你可以使用[]来访问张量中的元素。以下是一些常见的索引方法。

1. 一维张量的索引

首先,我们创建一个一维张量:

1
2
3
4
5
import torch

# 创建一维张量
tensor1d = torch.tensor([10, 20, 30, 40, 50])
print(tensor1d) # 输出: tensor([10, 20, 30, 40, 50])

我们可以通过索引访问单个元素:

1
2
# 访问第一个元素(索引0)
print(tensor1d[0]) # 输出: tensor(10)

2. 二维张量的索引

接下来,我们创建一个二维张量:

1
2
3
4
5
6
7
# 创建二维张量
tensor2d = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(tensor2d)
# 输出:
# tensor([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])

在二维张量中,我们可以通过行和列的索引来访问元素:

1
2
# 访问第二行第三列的元素
print(tensor2d[1, 2]) # 输出: tensor(6)

3. 使用切片访问部分元素

我们可以通过切片访问张量的一部分。例如,获取一维张量的前两个元素:

1
2
# 切片获取前两个元素
print(tensor1d[0:2]) # 输出: tensor([10, 20])

对于二维张量,我们可以通过切片获取特定的行或列:

1
2
3
4
5
6
7
8
# 获取前两行
print(tensor2d[0:2])
# 输出:
# tensor([[1, 2, 3],
# [4, 5, 6]])

# 获取第二列
print(tensor2d[:, 1]) # 输出: tensor([2, 5, 8])

张量的高级索引

1. 布尔索引

布尔索引允许基于条件选择元素。例如,我们想选择大于30的所有元素:

1
2
3
4
5
6
# 创建一维张量
tensor1d = torch.tensor([10, 20, 30, 40, 50])

# 使用布尔索引
result = tensor1d[tensor1d > 30]
print(result) # 输出: tensor([40, 50])

2. 花式索引

花式索引允许我们通过指定索引列表来选择元素。例如,选择特定位置的元素:

1
2
3
4
# 花式索引
indices = torch.tensor([0, 2, 4])
result = tensor1d[indices]
print(result) # 输出: tensor([10, 30, 50])

切片与视图

切片操作返回的是张量的一个“视图”,这意味着对视图进行修改会影响原始张量。例如:

1
2
3
4
5
6
7
8
9
10
11
12
# 创建二维张量
tensor2d = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
slice_tensor = tensor2d[0:2] # 切片

# 修改切片
slice_tensor[0, 0] = 100

print(tensor2d)
# 输出:
# tensor([[100, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9]])

如上所示,对slice_tensor的修改影响了tensor2d,因为它们共享相同的存储空间。

总结

本节中,我们学习了张量的索引和切片的基本用法,掌握了如何通过索引访问和操作张量中的数据。通过以上代码示例和案例分析,相信你已对这一内容有了较为深入的理解。

在下一篇教程中,我们将介绍自动求导的基本概念,它将为我们在深度学习中进行反向传播打下基础。希望你继续保持学习热情,为进入更复杂的深度学习领域做好准备!

7 张量的索引与切片

https://zglg.work/pytorch-zero/7/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论