news 2026/4/23 19:08:55

《解锁 PyTorch 张量:多维数据操作与 GPU 性能优化全解析》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《解锁 PyTorch 张量:多维数据操作与 GPU 性能优化全解析》

本篇技术博文摘要 🌟

  • 文章开篇详细介绍了张量的多维特性,通过 2D 矩阵及其他维度的创建方法,为读者构建起对张量结构的直观理解。
  • 随后深入解析张量的关键属性,包括数据类型、形状和设备位置,并通过示例代码加深理解。核心部分聚焦张量操作技术,涵盖基础运算、形状变换、数学计算、条件筛选及与其他张量的交互操作,为实际开发提供完整工具箱。
  • 文章特别强调了GPU 加速策略,指导如何将张量迁移至 GPU 并进行可用性检查,以最大化计算效能。
  • 最后,系统讲解PyTorch 与 NumPy 的互操作机制,包括内存共享与数据复制等关键细节,实现与科学计算生态的无缝衔接。整篇文章将理论解析与代码示例相结合,为读者提供了从基础到进阶的全面张量操作指南。

引言 📘

  • 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。
  • 我是盛透侧视攻城狮,一名什么都会一丢丢的网络安全工程师,也是众多技术社区的活跃成员以及多家大厂官方认可人员,希望能够与各位在此共同成长。

上节回顾

目录

本篇技术博文摘要 🌟

引言 📘

上节回顾

1.PyTorch 张量(Tensor)

​1.1各维度张量(Tensor)说明:

​1.2创建张量的方式表格

1.2.1创建 2D 张量(矩阵):

1.3.1其他维度的创建:

2.张量的属性表格

2.1示例

3.张量的操作

3.1张量的基础操作表

3.2形状操作

3.3具体操作示例

3.3.1索引和切片操作

3.3.2形状变换操作

3.3.3数学运算操作

3.3.4与其他张量的操作

3.3.5条件判断和筛选

4.张量的 GPU 加速

4.1将张量转移到 GPU:

4.2检查 GPU 是否可用:

5.张量与 NumPy 的互操作表

5.1张量与 NumPy 的互操作示例

5.1.1NumPy 数组转换为 PyTorch 张量

5.1.2PyTorch 张量转换为 NumPy 数组

5.1.3不共享内存的情况(需要复制数据)

欢迎各位彦祖与热巴畅游本人专栏与技术博客

你的三连是我最大的动力

点击➡️指向的专栏名即可闪现


1.PyTorch 张量(Tensor)

  • 张量是一个多维数组,可以是标量、向量、矩阵或更高维度的数据结构。

  • 在 PyTorch 中,张量(Tensor)是数据的核心表示形式,类似于 NumPy 的多维数组,但具有更强大的功能,例如支持 GPU 加速和自动梯度计算。

  • 张量支持多种数据类型(整型、浮点型、布尔型等)。

  • 张量可以存储在 CPU 或 GPU 中,GPU 张量可显著加速计算。

下图展示了不同维度的张量(Tensor)在 PyTorch 中的表示方法:

1.1各维度张量(Tensor)说明:

  • 1D Tensor / Vector(一维张量/向量):最基本的张量形式,可以看作是一个数组,图中的例子是一个包含 10 个元素的向量。
  • 2D Tensor / Matrix(二维张量/矩阵):二维数组,通常用于表示矩阵,图中的例子是一个 4x5 的矩阵,包含了 20 个元素。
  • 3D Tensor / Cube(三维张量/立方体):三维数组,可以看作是由多个矩阵堆叠而成的立方体,图中的例子展示了一个 3x4x5 的立方体,其中每个 5x5 的矩阵代表立方体的一个"层"。
  • 4D Tensor / Vector of Cubes(四维张量/立方体向量):四维数组,可以看作是由多个立方体组成的向量,图中的例子没有具体数值,但可以理解为一个包含多个 3D 张量的集合。
  • 5D Tensor / Matrix of Cubes(五维张量/立方体矩阵):五维数组,可以看作是由多个4D张量组成的矩阵,图中的例子同样没有具体数值,但可以理解为一个包含多个 4D 张量的集合。

1.2创建张量的方式表格

方法说明示例代码
torch.tensor(data)从 Python 列表或 NumPy 数组创建张量。x = torch.tensor([[1, 2], [3, 4]])
torch.zeros(size)创建一个全为零的张量。x = torch.zeros((2, 3))
torch.ones(size)创建一个全为 1 的张量。x = torch.ones((2, 3))
torch.empty(size)创建一个未初始化的张量。x = torch.empty((2, 3))
torch.rand(size)创建一个服从均匀分布的随机张量,值在[0, 1)x = torch.rand((2, 3))
torch.randn(size)创建一个服从正态分布的随机张量,均值为 0,标准差为 1。x = torch.randn((2, 3))
torch.arange(start, end, step)创建一个一维序列张量,类似于 Python 的rangex = torch.arange(0, 10, 2)
torch.linspace(start, end, steps)创建一个在指定范围内等间隔的序列张量。x = torch.linspace(0, 1, 5)
torch.eye(size)创建一个单位矩阵(对角线为 1,其他为 0)。x = torch.eye(3)
torch.from_numpy(ndarray)将 NumPy 数组转换为张量。x = torch.from_numpy(np.array([1, 2, 3]))
  • 使用 torch.tensor() 函数,你可以将一个列表或数组转换为张量:
import torch tensor = torch.tensor([1, 2, 3]) print(tensor)

  • 如果你有一个 NumPy 数组,可以使用 torch.from_numpy() 将其转换为张量:
import numpy as np np_array = np.array([1, 2, 3]) tensor = torch.from_numpy(np_array) print(tensor)

1.2.1创建 2D 张量(矩阵):

import torch tensor_2d = torch.tensor([ [-9, 4, 2, 5, 7], [3, 0, 12, 8, 6], [1, 23, -6, 45, 2], [22, 3, -1, 72, 6] ]) print("2D Tensor (Matrix):\n", tensor_2d) print("Shape:", tensor_2d.shape) # 形状

1.3.1其他维度的创建:

# 创建 3D 张量(立方体) tensor_3d = torch.stack([tensor_2d, tensor_2d + 10, tensor_2d - 5]) # 堆叠 3 个 2D 张量 print("3D Tensor (Cube):\n", tensor_3d) print("Shape:", tensor_3d.shape) # 形状 # 创建 4D 张量(向量的立方体) tensor_4d = torch.stack([tensor_3d, tensor_3d + 100]) # 堆叠 2 个 3D 张量 print("4D Tensor (Vector of Cubes):\n", tensor_4d) print("Shape:", tensor_4d.shape) # 形状 # 创建 5D 张量(矩阵的立方体) tensor_5d = torch.stack([tensor_4d, tensor_4d + 1000]) # 堆叠 2 个 4D 张量 print("5D Tensor (Matrix of Cubes):\n", tensor_5d) print("Shape:", tensor_5d.shape) # 形状

2.张量的属性表格

属性说明示例
.shape获取张量的形状tensor.shape
.size()获取张量的形状tensor.size()
.dtype获取张量的数据类型tensor.dtype
.device查看张量所在的设备 (CPU/GPU)tensor.device
.dim()获取张量的维度数tensor.dim()
.requires_grad是否启用梯度计算tensor.requires_grad
.numel()获取张量中的元素总数tensor.numel()
.is_cuda检查张量是否在 GPU 上tensor.is_cuda
.T获取张量的转置(适用于 2D 张量)tensor.T
.item()获取单元素张量的值tensor.item()
.is_contiguous()检查张量是否连续存储tensor.is_contiguous()

2.1示例

import torch # 创建一个 2D 张量 tensor = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32) # 张量的属性 print("Tensor:\n", tensor) print("Shape:", tensor.shape) # 获取形状 print("Size:", tensor.size()) # 获取形状(另一种方法) print("Data Type:", tensor.dtype) # 数据类型 print("Device:", tensor.device) # 设备 print("Dimensions:", tensor.dim()) # 维度数 print("Total Elements:", tensor.numel()) # 元素总数 print("Requires Grad:", tensor.requires_grad) # 是否启用梯度 print("Is CUDA:", tensor.is_cuda) # 是否在 GPU 上 print("Is Contiguous:", tensor.is_contiguous()) # 是否连续存储 # 获取单元素值 single_value = torch.tensor(42) print("Single Element Value:", single_value.item()) # 转置张量 tensor_T = tensor.T print("Transposed Tensor:\n", tensor_T)

3.张量的操作

3.1张量的基础操作表

操作说明示例代码
+,-,*,/元素级加法、减法、乘法、除法。z = x + y
torch.matmul(x, y)矩阵乘法。z = torch.matmul(x, y)
torch.dot(x, y)向量点积(仅适用于 1D 张量)。z = torch.dot(x, y)
torch.sum(x)求和。z = torch.sum(x)
torch.mean(x)求均值。z = torch.mean(x)
torch.max(x)求最大值。z = torch.max(x)
torch.min(x)求最小值。z = torch.min(x)
torch.argmax(x, dim)返回最大值的索引(指定维度)。z = torch.argmax(x, dim=1)
torch.softmax(x, dim)计算 softmax(指定维度)。z = torch.softmax(x, dim=1)

3.2形状操作

操作说明示例代码
x.view(shape)改变张量的形状(不改变数据)。z = x.view(3, 4)
x.reshape(shape)类似于view,但更灵活。z = x.reshape(3, 4)
x.t()转置矩阵。z = x.t()
x.unsqueeze(dim)在指定维度添加一个维度。z = x.unsqueeze(0)
x.squeeze(dim)去掉指定维度为 1 的维度。z = x.squeeze(0)
torch.cat((x, y), dim)按指定维度连接多个张量。z = torch.cat((x, y), dim=1)

3.3具体操作示例

3.3.1索引和切片操作

import torch # 创建一个 2D 张量 tensor = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32) print("原始张量:\n", tensor) print("\n【索引和切片】") print("获取第一行:", tensor[0]) # 获取第一行 print("获取第一行第一列的元素:", tensor[0, 0]) # 获取特定元素 print("获取第二列的所有元素:", tensor[:, 1]) # 获取第二列所有元素

3.3.2形状变换操作

import torch # 创建一个 2D 张量 tensor = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32) print("\n【形状变换】") reshaped = tensor.view(3, 2) # 改变张量形状为 3x2 print("改变形状后的张量:\n", reshaped) flattened = tensor.flatten() # 将张量展平成一维 print("展平后的张量:\n", flattened)

3.3.3数学运算操作

import torch # 创建一个 2D 张量 tensor = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32) print("\n【数学运算】") tensor_add = tensor + 10 # 张量加法 print("张量加 10:\n", tensor_add) tensor_mul = tensor * 2 # 张量乘法 print("张量乘 2:\n", tensor_mul) tensor_sum = tensor.sum() # 计算所有元素的和 print("张量元素的和:", tensor_sum.item())

3.3.4与其他张量的操作

import torch # 创建一个 2D 张量 tensor = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32) print("原始张量:\n", tensor) print("\n【与其他张量操作】") tensor2 = torch.tensor([[1, 1, 1], [1, 1, 1]], dtype=torch.float32) print("另一个张量:\n", tensor2) tensor_dot = torch.matmul(tensor, tensor2.T) # 张量矩阵乘法 print("矩阵乘法结果:\n", tensor_dot)

3.3.5条件判断和筛选

import torch # 创建一个 2D 张量 tensor = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32) print("原始张量:\n", tensor) print("\n【条件判断和筛选】") mask = tensor > 3 # 创建一个布尔掩码 print("大于 3 的元素的布尔掩码:\n", mask) filtered_tensor = tensor[tensor > 3] # 筛选出符合条件的元素 print("大于 3 的元素:\n", filtered_tensor)

4.张量的 GPU 加速

4.1将张量转移到 GPU:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') x = torch.tensor([1.0, 2.0, 3.0], device=device)

4.2检查 GPU 是否可用:

torch.cuda.is_available() # 返回 True 或 False

5.张量与 NumPy 的互操作表

操作说明示例代码
torch.from_numpy(ndarray)将 NumPy 数组转换为张量。x = torch.from_numpy(np_array)
x.numpy()将张量转换为 NumPy 数组(仅限 CPU 张量)。np_array = x.numpy()

5.1张量与 NumPy 的互操作示例

5.1.1NumPy 数组转换为 PyTorch 张量

import torch import numpy as np print("1. NumPy 转为 PyTorch 张量") numpy_array = np.array([[1, 2, 3], [4, 5, 6]]) print("NumPy 数组:\n", numpy_array) # 使用 torch.from_numpy() 将 NumPy 数组转换为张量 tensor_from_numpy = torch.from_numpy(numpy_array) print("转换后的 PyTorch 张量:\n", tensor_from_numpy) # 修改 NumPy 数组,观察张量的变化(共享内存) numpy_array[0, 0] = 100 print("修改后的 NumPy 数组:\n", numpy_array) print("PyTorch 张量也会同步变化:\n", tensor_from_numpy)

5.1.2PyTorch 张量转换为 NumPy 数组

import torch import numpy as np print("\n2. PyTorch 张量转为 NumPy 数组") tensor = torch.tensor([[7, 8, 9], [10, 11, 12]], dtype=torch.float32) print("PyTorch 张量:\n", tensor) # 使用 tensor.numpy() 将张量转换为 NumPy 数组 numpy_from_tensor = tensor.numpy() print("转换后的 NumPy 数组:\n", numpy_from_tensor) # 修改张量,观察 NumPy 数组的变化(共享内存) tensor[0, 0] = 77 print("修改后的 PyTorch 张量:\n", tensor) print("NumPy 数组也会同步变化:\n", numpy_from_tensor)

5.1.3不共享内存的情况(需要复制数据)

import torch import numpy as np print("\n3. 使用 clone() 保证独立数据") tensor_independent = torch.tensor([[13, 14, 15], [16, 17, 18]], dtype=torch.float32) numpy_independent = tensor_independent.clone().numpy() # 使用 clone 复制数据 print("原始张量:\n", tensor_independent) tensor_independent[0, 0] = 0 # 修改张量数据 print("修改后的张量:\n", tensor_independent) print("NumPy 数组(不会同步变化):\n", numpy_independent)

欢迎各位彦祖与热巴畅游本人专栏与技术博客

你的三连是我最大的动力

点击➡️指向的专栏名即可闪现

➡️计算机组成原理

➡️操作系统

➡️渗透终极之红队攻击行动

➡️动画可视化数据结构与算法

➡️永恒之心蓝队联纵合横防御

➡️华为高级网络工程师

➡️华为高级防火墙防御集成部署

➡️未授权访问漏洞横向渗透利用

➡️逆向软件破解工程

➡️MYSQL REDIS 进阶实操

➡️红帽高级工程师

➡️红帽系统管理员

➡️HVV 全国各地面试题汇总

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:34:53

2026年软件开发主流方向深度解析:趋势、市场格局与机会洞察

2026年的软件开发行业正经历一场深刻的结构化变革,AI原生、云原生与低代码技术的深度融合,推动行业从“以编码为核心”转向“以架构设计、AI协同与业务落地为导向”的新阶段。这一年,全球IT支出预计达到6.08万亿美元,同比增长9.8%…

作者头像 李华
网站建设 2026/4/23 13:18:49

2026 年软件开发全赛道解析:类型、技术、前景与职业发展指南

前言 在数字化全面渗透产业、人工智能与云计算深度重构开发范式的 2026 年,软件开发早已不是单一的 “写代码” 工作,而是细分出数十个垂直赛道。不同开发类型对应不同业务场景、技术栈、成长曲线和薪资天花板,无论是计算机相关专业的应届生…

作者头像 李华
网站建设 2026/4/23 9:43:14

OpenClaw「Clawdbot/Moltbot」 深入解析:核心架构深度剖析

OpenClaw 深入解析:核心架构深度剖析 文章目录OpenClaw 深入解析:核心架构深度剖析开源自主AI Agent标杆|本地自托管的「数字员工」与核心安全警示一、名称三次演变:从商标争议到开源定调二、核心架构:高度模块化的执行…

作者头像 李华