Pytorch中tensor常用语法

本文详细介绍了PyTorch中Tensor的各种数学运算方法,包括求和、乘积、均值、方差、极值等常见操作,以及线性插值、双曲正切等特殊函数。同时,还提供了生成随机数的多种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我把常用的Tensor的数学运算总结到这里,以防自己在使用PyTorch做实验时,忘记这些方法应该传什么参数。总结的方法包括:

  1. Tensor求和以及按索引求和:torch.sum() 和 torch.Tensor.indexadd()
  2. Tensor元素乘积:torch.prod(input)
  3. 对Tensor求均值、方差、极值:torch.mean() 、 torch.var() 、 torch.max() 、 torch.min()
  4. 求Tensor的平方根倒数:torch.rsqrt(input)
  5. 求Tensor的线性插值: torch.lerp(star,end,weight)
  6. 求Tensor的\双曲正切:torch.tanh(input, out=None)
元素求和

torch.sum(input) →\rightarrow Tensor
返回输入向量input中所有元素的和。

参数:

  • input (Tensor) - 输入张量

例子:
在这里插入图片描述

torch.sum(input, dim, keepdim=False, out=None) →\rightarrow Tensor

返回新的张量,其中包括输入张量input中指定维度dim中每行的和。

若keepdim值为True,则在输出张量中,除了被操作的dim维度值降为1,其它维度与输入张量input相同。否则,dim维度相当于被执行torch.squeeze()维度压缩操作,导致此维度消失,最终输出张量会比输入张量少一个维度。

参数:

  • input (Tensor) - 输入Tensor
  • dim (int) - 指定维度
  • keepdim (bool) - 输出张量是否保持与输入张量有相同数量的维度
  • out (Tensor,optional) - 结果张量

例子:
在这里插入图片描述

元素乘积

torch.prod(input) →\rightarrow Tensor
返回输入张量input所有元素的乘积。

参数:

  • input (Tensor) - 输入张量

例子:
在这里插入图片描述

torch.prod(input, dim, keepdim=False, out=None) →\rightarrow Tensor

返回新的张量,其中包括输入张量input中指定维度dim中每行的乘积。

若keepdim值为True,则在输出张量中,除了被操作的dim维度值降为1,其它维度与输入张量input相同。否则,dim维度相当于被执行torch.squeeze()维度压缩操作,导致此维度消失,最终输出张量会比输入张量少一个维度。

参数:

  • input (Tensor) - 输入Tensor
  • dim (int) - 指定维度
  • keepdim (bool) - 输出张量是否保持与输入张量有相同数量的维度
  • out (Tensor,optional) - 结果张量

例子:
在这里插入图片描述

按索引求和

torch.Tensor.indexadd(dim, index, tensor) →\rightarrow Tensor

按索引参数index中所确定的顺序,将参数张量tensor中的元素与执行本方法的张量的元素逐个相加。参数tensor的尺寸必须严格地与执行方法的张量匹配,否则会发生错误。

参数:

  • dim (int) - 索引index所指向的维度
  • index (LongTensor) - 包含索引数的张量
  • tensor (Tensor) - 含有相加元素的张量

例子:
在这里插入图片描述

平均数

torch.mean(input)→\rightarrow Tensor

返回输入张量input中每个元素的平均值。

参数:

  • input (Tensor) – 输入张量

例子:
在这里插入图片描述
torch.mean(input, dim, keepdim=False, out=None) →\rightarrow Tensor

返回新的张量,其中包含输入张量input指定维度dim中每行的平均值。

若keepdim值为True,则在输出张量中,除了被操作的dim维度值降为1,其它维度与输入张量input相同。否则,dim维度相当于被执行torch.squeeze()维度压缩操作,导致此维度消失,最终输出张量会比输入张量少一个维度。

参数:

  • input (Tensor) - 输入张量
  • dim (int) - 指定进行均值计算的维度
  • keepdim (bool, optional) - 输出张量是否保持与输入张量有相同数量的维度
  • out (Tensor) - 结果张量

例子:
在这里插入图片描述

方差

torch.var(input, unbiased=True) →\rightarrow Tensor

返回输入向量input中所有元素的方差。

参数:

  • input (Tensor) - 输入张量
  • unbiased (bool) - 是否使用基于修正贝塞尔函数的无偏估计

例子:
在这里插入图片描述

torch.var(input, dim, keepdim=False, unbiased=True, out=None) →\rightarrow Tensor

返回新的张量,其中包括输入张量input中指定维度dim中每行的方差。

若keepdim值为True,则在输出张量中,除了被操作的dim维度值降为1,其它维度与输入张量input相同。否则,dim维度相当于被执行torch.squeeze()维度压缩操作,导致此维度消失,最终输出张量会比输入张量少一个维度。

参数:

  • input (Tensor) - 输入Tensor
  • dim (int) - 指定维度
  • keepdim (bool) - 输出张量是否保持与输入张量有相同数量的维度
  • unbiased (bool) - 是否使用基于修正贝塞尔函数的无偏估计
  • out (Tensor,optional) - 结果张量

例子:
在这里插入图片描述

最大值

torch.max(input) →\rightarrow Tensor

返回输入张量所有元素的最大值。

参数:

  • input (Tensor) - 输入张量

例子:
在这里插入图片描述

torch.max(input, dim, keepdim=False, out=None) →\rightarrow (Tensor, LongTensor)

返回新的张量,其中包括输入张量input中指定维度dim中每行的最大值,同时返回每个最大值的位置索引。

若keepdim值为True,则在输出张量中,除了被操作的dim维度值降为1,其它维度与输入张量input相同。否则,dim维度相当于被执行torch.squeeze()维度压缩操作,导致此维度消失,最终输出张量会比输入张量少一个维度。

参数:

  • input (Tensor) - 输入Tensor
  • dim (int) - 指定维度
  • keepdim (bool) - 输出张量是否保持与输入张量有相同数量的维度
  • out (tuple,optional) - 结果张量

例子:
在这里插入图片描述

torch.max(input, other, out=None) →\rightarrow Tensor

逐个元素比较张量input与张量other,将比较出的最大值保存到输出张量中。
两个张量尺寸不需要完全相同,但需要支持自动扩展法则。

参数:

  • input (Tensor) - 输入Tensor
  • other (Tensor) - 另一个输入的Tensor
  • out (Tensor,optional) - 结果张量

例子:
在这里插入图片描述

最小值

torch.min(input) →\rightarrow Tensor
返回输入张量所有元素的最小值。

参数:

  • input (Tensor) - 输入张量

例子:
在这里插入图片描述

torch.min(input, dim, keepdim=False, out=None) →\rightarrow (Tensor, LongTensor)

返回新的张量,其中包括输入张量input中指定维度dim中每行的最小值,同时返回每个最小值的位置索引。

若keepdim值为True,则在输出张量中,除了被操作的dim维度值降为1,其它维度与输入张量input相同。否则,dim维度相当于被执行torch.squeeze()维度压缩操作,导致此维度消失,最终输出张量会比输入张量少一个维度。

参数:

  • input (Tensor) - 输入Tensor
  • dim (int) - 指定维度
  • keepdim (bool) - 输出张量是否保持与输入张量有相同数量的维度
  • out (tuple,optional) - 结果张量

例子:
在这里插入图片描述

torch.min(input, other, out=None) →\rightarrow Tensor

逐个元素比较张量input与张量other,将比较出的最小值保存到输出张量中。
两个张量尺寸不需要完全相同,但需要支持自动扩展法则。

参数:

  • input (Tensor) - 输入Tensor
  • other (Tensor) - 另一个输入的Tensor
  • out (Tensor,optional) - 结果张量

例子:
在这里插入图片描述

平方根倒数

torch.rsqrt(input) →\rightarrow Tensor

返回新的张量,其中包含input张量每个元素平方根的倒数。

参数:

  • input (Tensor) – 输入张量
  • out (Tensor, optional) – 输出张量

例子:
在这里插入图片描述

线性插值

torch.lerp(star,end,weight) →\rightarrow Tensor

基于weight对输入的两个张量start与end逐个元素计算线性插值,结果返回至输出张量。

返回结果是: outsi=starti+weight∗(endi−starti){outs}_i = {start}_i + weight * (end_i - start_i)outsi=starti+weight(endistarti)

参数:

  • start (Tensor) – 起始点张量
  • end (Tensor) – 终止点张量
  • weight (float) – 插入公式的 weight
  • out (Tensor, optional) – 结果张量

例子:
在这里插入图片描述

双曲正切

torch.tanh(input, out=None) →\rightarrow Tensor

返回新的张量,其中包括输入张量input中每个元素的双曲正切。

参数:

  • input (Tensor) - 输入张量
    -out (Tensor,optional) - 结果张量

例子:
在这里插入图片描述
最后说一下生成随机数Tensor的方法,比如:torch.rand()、torch.randn()、torch.normal()、torch.linespace()。

均匀分布

*torch.rand(sizes, out=None) →\rightarrow Tensor

返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。

参数:

  • sizes (int…) - 整数序列,定义了输出张量的形状
  • out (Tensor, optinal) - 结果张量

例子:
在这里插入图片描述

标准正态分布

*torch.randn(sizes, out=None) →\rightarrow Tensor

返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。

参数:

  • sizes (int…) - 整数序列,定义了输出张量的形状
  • out (Tensor, optinal) - 结果张量

例子:
在这里插入图片描述

离散正态分布

torch.normal(means, std, out=None) →\rightarrow Tensor

返回一个张量,包含了从指定均值means和标准差std的离散正态分布中抽取的一组随机数。

标准差std是一个张量,包含每个输出元素相关的正态分布标准差。

参数:

  • means (float, optional) - 均值
  • std (Tensor) - 标准差
  • out (Tensor) - 输出张量

例子:
在这里插入图片描述

线性间距向量

torch.linspace(start, end, steps=100, out=None) →\rightarrow Tensor

返回一个1维张量,包含在区间start和end上均匀间隔的step个点。

输出张量的长度由steps决定。

参数:

  • start (float) - 区间的起始点
  • end (float) - 区间的终点
  • steps (int) - 在start和end间生成的样本数
  • out (Tensor, optional) - 结果张量

例子:
在这里插入图片描述

<think>嗯,用户想了解PyTorchTensor切片,我需要详细介绍一下。首先,得回忆一下Tensor切片的基础知识。PyTorchTensor切片和NumPy的数组切片类似,可能用户之前用过NumPy,所以可以类比说明。 应该从基本切片操作开始,比如使用start:end:step这样的格式。然后举例说明不同维度的切片方法,比如二维、三维的情况。还要提到省略号...和None的用法,这些可能对处理高维数据有帮助。 然后需要注意一些高级技巧,比如使用布尔掩码或者索引数组,这些在特定情况下很有用。还有view和reshape的区别,可能用户会混淆这两者,需要简单说明。 另外,内存共享的问题很重要,切片后的Tensor和原数据共享内存,修改会影响原Tensor。如果需要复制,应该用clone(),这点必须提到,避免用户出错。 可能用户的应用场景是深度学习中的数据预处理或模型中间层操作,所以例子要贴近实际应用,比如处理图像数据、序列数据等。需要确保例子简单明了,容易理解。 还要考虑用户可能的疑问点,比如切片时的越界问题,或者如何选择特定元素。可能需要提醒索引从0开始,负数的意义,以及步长可以是负数实现逆序。 最后,整理结构,分点讲解,先基础后高级,每个部分配上示例代码,这样用户看起来清晰。可能还需要对比PyTorch和NumPy的不同之处,如果有的话,但通常它们是相似的,所以可能不需要特别强调区别。 总之,内容要全面,结构清晰,例子实用,同时注意关键点如内存共享和复制操作。这样用户能快速掌握Tensor切片的用法,并应用到实际项目中。</think>PyTorch 的 **Tensor 切片**(Slicing)是一种高效操作多维数组的方法,语法与 Python 列表切片和 NumPy 数组切片类似。通过切片,你可以灵活地提取、修改或重组 Tensor 的数据,而无需复制底层数据(内存共享)。以下是关键知识点和示例: --- ### **1. 基本切片语法** 使用 `start:end:step` 格式对每个维度进行切片: - `start`: 起始索引(包含) - `end`: 结束索引(不包含) - `step`: 步长(默认为1) - 若省略某一维的切片,则默认选取该维度的所有元素。 #### **示例代码:** ```python import torch x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 取第0行所有列 print(x[0, :]) # tensor([1, 2, 3]) # 取第1列所有行 print(x[:, 1]) # tensor([2, 5, 8]) # 取前两行,每行前两列 print(x[:2, :2]) # tensor([[1, 2], [4, 5]]) # 步长为2取元素 print(x[::2, ::2]) # tensor([[1, 3], [7, 9]]) ``` --- ### **2. 高级切片技巧** #### **(1) 负索引与省略号** - **负索引**:从末尾开始计数(例如 `-1` 表示最后一个元素)。 - **`...`**:自动填充剩余维度(常用于高维 Tensor)。 ```python # 取最后一列 print(x[:, -1]) # tensor([3, 6, 9]) # 四维Tensor示例(如批量图像数据: [B, C, H, W]) y = torch.randn(2, 3, 32, 32) print(y[0, ...].shape) # 等价于 y[0, :, :, :],输出 [3, 32, 32] ``` #### **(2) 掩码(布尔索引)** 通过布尔条件筛选元素: ```python mask = x > 5 print(x[mask]) # tensor([6, 7, 8, 9]) ``` #### **(3) 索引数组** 用整数 Tensor 指定索引位置: ```python indices = torch.tensor([0, 2]) print(x[:, indices]) # 选取第0列和第2列,输出 [[1,3], [4,6], [7,9]] ``` --- ### **3. 维度操作与扩展** #### **(1) 增删维度** - **`unsqueeze(dim)`** 或 **`None`**:增加维度。 - **`squeeze()`**:删除大小为1的维度。 ```python z = x[0, :] # shape: [3] z = z.unsqueeze(0) # shape: [1, 3] z = z.squeeze() # shape: [3] ``` #### **(2) 合并与分割** - **`torch.cat()`**:沿指定维度拼接 Tensor。 - **`torch.stack()`**:新增维度拼接 Tensor。 - **`torch.split()`** 或 **`torch.chunk()`**:按大小或数量分割 Tensor。 --- ### **4. 内存共享与拷贝** - **切片操作默认共享内存**:修改切片后的 Tensor 会影响原始 Tensor。 - **显式拷贝**:使用 `.clone()` 创建独立副本。 ```python subset = x[:2, :2] subset[0, 0] = 100 print(x) # 原始Tensor的第一个元素被修改为100 # 避免内存共享 subset_copy = x[:2, :2].clone() ``` --- ### **5. 实战场景示例** #### **(1) 图像处理** ```python # 假设图像格式为 [C, H, W] image = torch.randn(3, 256, 256) cropped = image[:, 100:200, 50:150] # 裁剪中心区域 ``` #### **(2) 序列数据处理** ```python # 序列数据格式 [Seq_Len, Features] sequence = torch.randn(10, 128) first_5_steps = sequence[:5, :] # 取前5个时间步 ``` --- ### **总结** PyTorch Tensor 切片提供了类似 Python/NumPy 的灵活操作,结合 GPU 加速和自动求导,是深度学习数据处理的核心工具。关键点包括: - 基础切片语法 `start:end:step` - 高级索引(掩码、索引数组) - 内存共享机制与 `.clone()` 的使用 - 维度操作(`unsqueeze`, `squeeze`) 通过合理使用切片,可以高效处理高维数据(如图像、视频、文本序列),同时减少内存占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值