Torch对tensor的操作

本文详细介绍了Torch中处理tensor的一些基本操作,包括arange和range在创建序列时的区别,stack和cat在拼接tensor上的不同,meshgrid用于生成网格数据的方法,以及roll如何实现tensor的滚动移位。这些操作对于理解和使用Torch进行深度学习计算至关重要。

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

本文不定期更新Torch对tensor的操作,以便自己翻阅。

torch.arange

在这里插入图片描述
包括start但不包括end

torch.arange(start=0, end=10)

output: tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

torch.range

在这里插入图片描述
包括start也包括end

torch.range(start=0, end=10)

output: tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

torch.stack

对tensors沿指定维度拼接,但返回的Tensor会多一维

a = torch.rand((2, 3))
b = torch.rand((2, 3))
c = torch.stack((a, b))

a:tensor([[0.5382, 0.3976, 0.8762],
        [0.3972, 0.7169, 0.3709]])
b:tensor([[0.1340, 0.2853, 0.2138],
        [0.3453, 0.4621, 0.4928]])
c:tensor([[[0.5382, 0.3976, 0.8762],
         [0.3972, 0.7169, 0.3709]],

        [[0.1340, 0.2853, 0.2138],
         [0.3453, 0.4621, 0.4928]]])

torch.cat

对tensors沿指定维度拼接,但返回的Tensor的维数不会变

a = torch.rand((2, 3))
b = torch.rand((2, 3))
c = torch.cat((a, b))

a:tensor([[0.0786, 0.0485, 0.5844],
        [0.4046, 0.4808, 0.1020]])
b:tensor([[0.1524, 0.0860, 0.6044],
        [0.2269, 0.6359, 0.4811]])
c:tensor([[0.0786, 0.0485, 0.5844],
        [0.4046, 0.4808, 0.1020],
        [0.1524, 0.0860, 0.6044],
        [0.2269, 0.6359, 0.4811]])

torch.meshgrid

在这里插入图片描述
分别沿x,y方向复制原tensor

a = torch.rand((3))
b = torch.rand((3))
grid_x, grid_y = torch.meshgrid(a, b)

a:tensor([0.9323, 0.7317, 0.2884])
b:tensor([0.1748, 0.1502, 0.2425])
grid_x:tensor([[0.9323, 0.9323, 0.9323],
        [0.7317, 0.7317, 0.7317],
        [0.2884, 0.2884, 0.2884]])                grid_y:tensor([[0.1748, 0.1502, 0.2425],
        [0.1748, 0.1502, 0.2425],
        [0.1748, 0.1502, 0.2425]])

torch.roll

shifts正值表示向下或者向右移(针对二维矩阵的说法,多维的话按照dim的顺序一次移位)
在这里插入图片描述

x = torch.randn((2, 2, 2))
a = torch.roll(x, shifts=1, dims=0)  # Positive value for move down, Negative value for move up
b = torch.roll(x, shifts=-1, dims=0)
c = torch.roll(x, shifts=1, dims=1)  # Positive value for move right, Negative value for move left
d = torch.roll(x, shifts=-1, dims=1)
e = torch.roll(x, shifts=(2, 1), dims=(0, 1))

x: tensor([[[ 0.1849,  1.1720],
         [ 0.4960, -1.8808]],

        [[ 1.0971, -1.3632],
         [ 0.0913,  0.3840]]])
a: tensor([[[ 1.0971, -1.3632],
         [ 0.0913,  0.3840]],

        [[ 0.1849,  1.1720],
         [ 0.4960, -1.8808]]])
b: tensor([[[ 1.0971, -1.3632],
         [ 0.0913,  0.3840]],

        [[ 0.1849,  1.1720],
         [ 0.4960, -1.8808]]])
c: tensor([[[ 0.4960, -1.8808],
         [ 0.1849,  1.1720]],

        [[ 0.0913,  0.3840],
         [ 1.0971, -1.3632]]])
d: tensor([[[ 0.4960, -1.8808],
         [ 0.1849,  1.1720]],

        [[ 0.0913,  0.3840],
         [ 1.0971, -1.3632]]])
e: tensor([[[ 0.4960, -1.8808],
         [ 0.1849,  1.1720]],

        [[ 0.0913,  0.3840],
         [ 1.0971, -1.3632]]])
<think>好的,我现在需要回答用户关于PyTorchtorch.Tensortorch.tensor的区别及使用场景的问题。首先,我得回忆一下这两个函数的不同之处。根据用户提供的引用内容,尤其是引用[1]和[2],我记得torch.Tensor是一个类,而torch.tensor是一个工厂函数。用户提到torch.Tensor使用全局默认的数据类型,通常是FloatTensor,而torch.tensor会根据输入数据推断数据类型。 接下来,我需要整理它们的主要区别。首先是数据类型的处理。torch.Tensor在创建时如果不指定数据,会调用torch.empty,这可能包含未初始化的值,而torch.tensor则会根据数据推断类型。例如,用torch.Tensor([1,2])会得到浮点张量,而torch.tensor([1,2])会得到整型张量。这一点需要明确说明。 然后是默认参数的差异。torch.Tensor不接受dtype等参数,但torch.tensor可以指定dtype、device等参数。这在使用时会影响张量的创建方式,比如是否需要显式指定类型或设备。 接下来是使用场景。根据引用[3],当需要与其它库交互时,比如matplotlib,可能需要将张量转换为Python标量,这时使用.item()方法,但这也涉及到张量的创建方式是否正确。例如,如果用户需要精确控制数据类型,应该使用torch.tensor并指定参数;而如果只是需要一个空的张量,可能用torch.Tensor更快。 还需要注意一些常见的误区,比如用户可能会混淆两者的构造函数,导致数据类型不符合预期。例如,使用torch.Tensor(2,3)会创建一个未初始化的2x3张量,而torch.tensor(2,3)会报错,因为参数不正确。这时候需要提醒用户注意参数传递的方式。 此外,要确保回答中引用了用户提供的参考内容,比如在提到数据类型推断时引用[2],在提到与其它库交互时引用[3]。最后,生成的相关问题应该覆盖区别、使用场景、转换方法以及常见错误,帮助用户进一步学习。</think>在PyTorch中,`torch.Tensor`与`torch.tensor`的核心区别体现在**数据类型控制**和**默认行为**上,具体差异如下: --- ### 一、核心区别对比 | 特性 | torch.Tensor | torch.tensor | |--------------------|----------------------------------|----------------------------------| | **数据类型推断** | 不根据输入数据推断类型,默认使用`torch.float32`[^2] | 根据输入数据自动推断类型[^1] | | **空张量创建** | 默认调用`torch.empty()`,可能包含未初始化值 | 必须提供数据,无法创建空张量 | | **参数灵活性** | 不支持直接指定`dtype`/`device`参数 | 支持`dtype`/`device`/`requires_grad`参数 | | **语法性质** | 是类名(构造函数) | 是工厂函数(更灵活的初始化方式) | --- ### 二、使用场景详解 1. **优先使用`torch.tensor`的场景** - 需要**精确控制数据类型**时: ```python # 明确指定int64类型 a = torch.tensor([1, 2], dtype=torch.int64) ``` - 需要**设备指定**时: ```python # 创建GPU张量 b = torch.tensor([3.0], device='cuda') ``` - 需要**梯度追踪**时: ```python c = torch.tensor(5.0, requires_grad=True) ``` 2. **使用`torch.Tensor`的场景** - 快速创建**未初始化的大内存张量**: ```python empty_tensor = torch.Tensor(1000, 1000) # 适用于预分配内存 ``` - 需要保持**全局默认类型一致性**时: ```python # 假设全局默认类型为float16 torch.set_default_tensor_type(torch.HalfTensor) consistent_tensor = torch.Tensor([1.5, 2.5]) # 自动转为float16 ``` --- ### 三、典型误区解析 1. **数据污染问题** ```python # 错误示例:可能包含内存残留值 risky_tensor = torch.Tensor(3,3) # 未初始化 # 正确做法:显式初始化 safe_tensor = torch.tensor([[0.0]*3 for _ in range(3)]) ``` 2. **维度理解错误** ```python # 错误:创建标量而非向量 scalar = torch.Tensor(5) # 生成维度为[]的标量 # 正确:明确维度结构 vector = torch.tensor([5]) # 生成维度为[1]的向量 ``` --- ### 四、最佳实践建议 1. **类型安全优先原则** - 使用`torch.tensor`配合显式类型声明: ```python dtype_safe = torch.tensor(0, dtype=torch.uint8) ``` 2. **与外部库交互规范** - 使用`.item()`进行标量转换[^3]: ```python # Matplotlib示例 point = torch.tensor([3.0, 4.0]) plt.plot(point[0].item(), point[1].item()) ``` 3. **内存优化技巧** - 对大规模数据使用`torch.Tensor`预分配内存: ```python buffer = torch.Tensor(1000000) # 预分配内存 buffer[:] = torch.randn(1000000) # 后续填充数据 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值