tensor和numpy 转换

1. numpy转tensor

1.1 torch.from_numpy()

如果你有一个 NumPy 数组,你可以直接使用 torch.from_numpy 方法将其转换为 PyTorch 张量

这个方法会创建一个新的张量,该张量与原始的NumPy数组共享内存空间。这意味着,如果你修改了其中一个,另一个也会相应地改变。

import numpy as np
import torch

np_array = np.array([1, 2, 3])
tensor = torch.from_numpy(np_array)
print(tensor)

如果你想在 GPU 上创建张量,可以先将 NumPy 数组转换为张量,然后使用.to方法将其移动到 GPU。

tensor = torch.from_numpy(np_array).to('cuda')

1.2 torch.tensor()

torch.tensor() 是 PyTorch 中用于创建新张量(tensor)的函数。这个函数非常灵活,可以接受多种类型的输入,包括列表、元组、NumPy 数组、标量值,甚至是另一个张量。它将这些输入转换为 PyTorch 张量,并默认复制数据,这意味着原始数据和新创建的张量在内存中是独立的

# 指定数据类型为float
tensor_with_dtype = torch.tensor([1, 2, 3], dtype=torch.float)
print(tensor_with_dtype)

# 指定数据类型为long
tensor_with_dtype_long = torch.tensor([1, 2, 3], dtype=torch.long)
print(tensor_with_dtype_long)

指定device

if torch.cuda.is_available():
    tensor_on_gpu = torch.tensor([1, 2, 3], device='cuda')
    print(tensor_on_gpu)

注意事项

  • torch.tensor() 默认会复制输入数据,创建一个新的张量副本。这意味着对新张量的修改不会影响到原始数据。
  • 你可以指定数据类型(dtype),如果不指定,PyTorch 会尝试推断数据类型或使用默认类型(通常是 torch.float32)。
  • 你可以指定设备(device),将张量创建在 CPU 或 GPU 上。

1.3 torch.as_tensor()

在PyTorch中,torch.as_tensor函数用于将数据转换为一个新的torch.Tensor对象。这个函数对于将不同类型的数据(如列表、元组、NumPy数组等)转换为PyTorch张量非常有用。它通常用于数据预处理阶段,将数据转换为模型可以接受的格式

  • 从列表创建张量
import torch

list_data = [1, 2, 3]
tensor = torch.as_tensor(list_data)
print(tensor)  # 输出: tensor([1, 2, 3])
  • 从NumPy数组创建张量
import numpy as np
import torch

np_array = np.array([1, 2, 3])
tensor = torch.as_tensor(np_array)
print(tensor)  # 输出: tensor([1, 2, 3])
  • 从元组创建张量:
import torch

tuple_data = (1, 2, 3)
tensor = torch.as_tensor(tuple_data)
print(tensor)  # 输出: tensor([1, 2, 3])
  • 指定数据类型
import torch

list_data = [1, 2, 3]
tensor = torch.as_tensor(list_data, dtype=torch.float32)
print(tensor)  # 输出: tensor([1., 2., 3.], dtype=torch.float32)
  • 设备指定
import torch

list_data = [1, 2, 3]
tensor = torch.as_tensor(list_data, device='cuda:0')  # 假设有一个可用的CUDA设备
print(tensor)  # 输出: tensor([1., 2., 3.], device='cuda:0')

torch.as_tensor函数提供了一个灵活的方式来创建张量,并且可以指定数据类型和设备,这对于深度学习模型的输入数据准备非常有用。

1.4 对比

torch.from_numpy()、torch.tensor()和torch.as_tensor()这三种方法都可以用来将NumPy数组转换为PyTorch张量,但它们之间有一些差异:

(1). torch.from_numpy(numpy_array)

  • 这个方法会创建一个新的张量,该张量与原始的NumPy数组共享内存空间。这意味着,如果你修改了其中一个,另一个也会相应地改变。
  • 它只接受NumPy数组作为输入,并且要求NumPy数组的数据类型是PyTorch支持的类型。
    它不会对数据进行复制,因此转换非常高效。

(2)torch.tensor(numpy_array)

  • 这个方法会创建一个新的张量,并且复制NumPy数组中的数据。这意味着,原始的NumPy数组和新创建的张量是完全独立的,修改其中一个不会影响另一个。

  • 因为它会复制数据,所以相比于torch.from_numpy(),它的效率会稍低。

(3) torch.as_tensor(numpy_array)

  • 这个方法会尝试避免复制数据,如果可能的话,它将与torch.from_numpy()一样共享内存。但是,如果NumPy数组的数据类型不是PyTorch支持的类型,它会复制数据并转换数据类型。
  • 它比torch.from_numpy更灵活,因为它可以接受更多的输入类型,包括标量、列表、元组等,并且会尝试将它们转换为张量。
  • 如果输入是标量或Python原生类型,它会创建一个包含该值的零维张量

总结来说,如果你不需要复制数据,并且你的NumPy数组已经是PyTorch支持的数据类型,那么torch.from_numpy()是最快的选择。如果你需要一个独立的副本,那么torch.tensor()是合适的。而torch.as_tensor()则是一个折中的选择,它在可能的情况下避免复制,但在必要时会复制并转换数据类型。

2. tensor 转numpy

tensor 转numpy 就比较简单了,可以使用下面的函数直接转,

def to_numpy(tensor_data):
    return tensor_data.detach().cpu().numpy() if tensor_data.requires_grad else tensor_data.cpu().numpy()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@BangBang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值