当前位置: 首页 > ds >正文

PyTorch数据操作基础教程:从张量创建到高级运算

本文通过示例代码全面讲解PyTorch中张量的基本操作,包含创建、运算、广播机制、索引切片等核心功能,并提供完整的代码和输出结果。


1. 张量创建与基本属性

import torch# 创建连续数值张量
x = torch.arange(12, dtype=torch.float32)
print("原始张量:\n", x)
print("形状:", x.shape)
print("元素总数:", x.numel())# 创建全零/全一张量
zero = torch.zeros(2, 3, 4)
print("\n三维零张量:\n", zero)one = torch.ones(3, 4)
print("\n全一张量:\n", one)# 手动创建张量
a = torch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
print("\n自定义张量:\n", a)

输出结果

原始张量:tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11.])
形状: torch.Size([12])
元素总数: 12三维零张量:tensor([[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]],[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]]])全一张量:tensor([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])自定义张量:tensor([[ 1,  2,  3,  4],[ 5,  6,  7,  8],[ 9, 10, 11, 12]])

2. 张量重塑与转置

x = x.reshape(3, 4)
print("重塑后的3x4张量:\n", x)
print("转置张量:\n", x.T)

输出结果

重塑后的3x4张量:tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.]])
转置张量:tensor([[ 0.,  4.,  8.],[ 1.,  5.,  9.],[ 2.,  6., 10.],[ 3.,  7., 11.]])

3. 数学运算

# 矩阵减法
print("x - one:\n", x - one)# 指数运算
b = torch.exp(a)
print("\n指数运算结果:\n", b)

输出结果

x - one:tensor([[-1.,  0.,  1.,  2.],[ 3.,  4.,  5.,  6.],[ 7.,  8.,  9., 10.]])指数运算结果:tensor([[2.7183e+00, 7.3891e+00, 2.0086e+01, 5.4598e+01],[1.4841e+02, 4.0343e+02, 1.0966e+03, 2.9810e+03],[8.1031e+03, 2.2026e+04, 5.9874e+04, 1.6275e+05]])

4. 张量拼接与比较

# 行拼接
c = torch.cat((x, one), dim=0)
print("行拼接结果:\n", c)# 列拼接
d = torch.cat((x, one), dim=1)
print("\n列拼接结果:\n", d)# 张量比较
print("\n张量比较:\n", x == a)

输出结果

行拼接结果:tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[ 1.,  1.,  1.,  1.],[ 1.,  1.,  1.,  1.],[ 1.,  1.,  1.,  1.]])列拼接结果:tensor([[ 0.,  1.,  2.,  3.,  1.,  1.,  1.,  1.],[ 4.,  5.,  6.,  7.,  1.,  1.,  1.,  1.],[ 8.,  9., 10., 11.,  1.,  1.,  1.,  1.]])张量比较:tensor([[False, False, False, False],[False, False, False, False],[False, False, False, False]])

5. 广播机制

e = torch.arange(3).reshape(3, 1)
print("广播加法:\n", x + e)

输出结果

广播加法:tensor([[ 0.,  1.,  2.,  3.],[ 5.,  6.,  7.,  8.],[10., 11., 12., 13.]])

6. 索引与切片

print("最后一行:", x[-1])
print("第二到第三行:\n", x[1:3])x[1, 2] = 100  # 修改单个元素
x[0:2, 1:3] = 0  # 修改子区域
print("\n修改后的张量:\n", x)

输出结果

最后一行: tensor([ 8.,  9., 10., 11.])
第二到第三行:tensor([[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.]])修改后的张量:tensor([[ 0.,  0.,  0.,  3.],[ 4.,  0.,  0.,  7.],[ 8.,  9., 10., 11.]])

7. 内存地址管理

before = id(x)
x = x + a  # 新内存分配
# x += a    # 原地操作
print("内存地址是否变化:", before == id(x))D = x.clone()
print("克隆张量地址对比:", before == id(D))

输出结果

内存地址是否变化: False
克隆张量地址对比: False

8. PyTorch与NumPy转换

A = x.numpy()
B = torch.tensor(A)
print("类型转换:", type(A), type(B))

输出结果

类型转换: <class 'numpy.ndarray'> <class 'torch.Tensor'>

9. 统计操作

sum_a = a.sum(axis=1, keepdims=True)
print("按行求和:\n", sum_a)
print("归一化结果:\n", a / sum_a)
print("按列累加:\n", a.cumsum(axis=0))

输出结果

按行求和:tensor([[10],[26],[42]])
归一化结果:tensor([[0.1000, 0.2000, 0.3000, 0.4000],[0.1923, 0.2308, 0.2692, 0.3077],[0.2143, 0.2381, 0.2619, 0.2857]])
按列累加:tensor([[ 1,  2,  3,  4],[ 6,  8, 10, 12],[15, 18, 21, 24]])

通过本文的示例代码,您可以快速掌握PyTorch张量操作的核心功能。建议读者在实际项目中多加练习以巩固知识!

http://www.xdnf.cn/news/422.html

相关文章:

  • 2563.统计公平数对的数目 是否顺序无关?
  • 【java实现+4种变体完整例子】排序算法中【希尔排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
  • Java 内存优化:如何避免内存泄漏?
  • 系分架构论文《论高并发场景的架构设计和开发方法》
  • REST 架构详解:从概念到应用的全面剖析
  • Vue3 + Three.js 场景编辑器开发实践
  • jangow靶机笔记(Vulnhub)
  • LeetCode 1365. 有多少小于当前数字的数字 java题解
  • phpy通用扩展:让PHP和Python手拉手
  • 基于SFC的windows修复程序,修复绝大部分系统损坏
  • 如何0基础学stm32?
  • 【操作系统原理01】操作系统引论
  • vue生命周期
  • 安徽合肥京东自营代运营如何突围?
  • 【网络技术_域名解析DNS】三、DNS 中间件实践应用与优化策略
  • Docker Swarm 容器与普通 Docker 容器的网卡差异
  • RTMP握手流程
  • 18、TimeDiff论文笔记
  • 用usb网卡 虚拟机无法开到全双工的解决办法
  • CUDA编程中影响正确性的小细节总结
  • mysql的函数(第一期)
  • [每周一更]-(第140期):sync.Pool 使用详解:性能优化的利器
  • 【漫话机器学习系列】211.驻点(Stationary Points)
  • opencv--图像处理
  • [密码学基础]GMT 0029-2014签名验签服务器技术规范深度解析
  • 性能比拼: Elixir vs Go(第二轮)
  • [密码学基础]密码学发展简史:从古典艺术到量子安全的演进
  • 免费多平台运行器,手机畅玩经典主机大作
  • 【数据结构】励志大厂版·初阶(复习+刷题)单链表
  • 简单线段树的讲解(一点点的心得体会)