在 PyTorch 中,tensor 是一种强大且灵活的数据结构,可以与多种 Python 常用数据结构(如 int, list, numpy array 等)互相转换。下面是详细解释和代码示例:


1. Tensor ↔ int / float

转为 int / float(前提是 tensor 中只有一个元素)

import torcht = torch.tensor(3.14)
i = t.item()        # 转为 float
j = int(t.item())   # 强制转为 intprint(i)  # 3.14
print(j)  # 3

.item() 只能用于单元素张量:tensor.numel() == 1,否则会报错。


2. Tensor ↔ list

Tensor 转 list(Python 原生嵌套 list)

t = torch.tensor([[1, 2], [3, 4]])
lst = t.tolist()
print(lst)  # [[1, 2], [3, 4]]

list 转 Tensor

lst = [[1, 2], [3, 4]]
t = torch.tensor(lst)
print(t)  # tensor([[1, 2], [3, 4]])

支持嵌套 list(矩阵)、一维 list(向量)。


3. Tensor ↔ numpy.ndarray

PyTorch Tensor 和 NumPy array 之间可以无缝转换,共享内存(改变其中一个会影响另一个)。

Tensor → numpy array

import numpy as np
t = torch.tensor([[1, 2], [3, 4]])
a = t.numpy()
print(type(a))  # <class 'numpy.ndarray'>

numpy array → Tensor

a = np.array([[1, 2], [3, 4]])
t = torch.from_numpy(a)
print(type(t))  # <class 'torch.Tensor'>

numpy 数组必须是数值型(不能是对象数组等),否则会报错。


4. Tensor ↔ Python scalar 类型(int, float)

如果你从计算结果中获取单个数值,比如:

t = torch.tensor([5.5])
val = float(t)   # 也可以使用 float(t.item())
print(val)       # 5.5# 对于整型:
t2 = torch.tensor([3])
val2 = int(t2)   # 等效于 int(t2.item())
print(val2)      # 3

5. Tensor ↔ bytes(用于序列化,如保存到文件)

Tensor → bytes

t = torch.tensor([1, 2, 3])
b = t.numpy().tobytes()

bytes → Tensor

import numpy as np
b = b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
a = np.frombuffer(b, dtype=np.int32)
t = torch.from_numpy(a)
print(t)  # tensor([1, 2, 3], dtype=torch.int32)

6.实战示例

下面我们从三个实际应用场景来讲解 PyTorch 中 tensor 与其他类型(如 listnumpyint 等)相互转换的用途和技巧:


场景一:数据加载与预处理

读取图像数据(使用 PIL) → 转为 tensor
from PIL import Image
from torchvision import transformsimg = Image.open('cat.jpg')  # 打开图片为 PIL.Image
to_tensor = transforms.ToTensor()
t = to_tensor(img)  # 转为 [C, H, W] 的 float32 Tensor

此时你获得了一个 Tensor,可以送入模型。但如果你想可视化或分析:

Tensor → numpy → 可视化或保存
import matplotlib.pyplot as pltimg_np = t.permute(1, 2, 0).numpy()  # [H, W, C]
plt.imshow(img_np)
plt.show()

permute 是因为 ToTensor 会变成 [C,H,W],而 matplotlib 需要 [H,W,C]


场景二:模型推理后的结果处理(转为 Python 值)

假设你有一个分类网络,输出如下:

output = torch.tensor([[0.1, 0.7, 0.2]])  # 假设输出为 batch_size=1 的 logits
pred_idx = output.argmax(dim=1)  # tensor([1])

你要拿到预测类别的整数值:

pred_class = pred_idx.item()  # 1
print(type(pred_class))       # <class 'int'>

.item() 在推理阶段非常常用!


场景三:保存 Tensor 到磁盘 / 网络传输

Tensor 保存和加载时经常需要转为 numpy 或 byte 流:

保存为 bytes 再写入文件
t = torch.tensor([1, 2, 3, 4], dtype=torch.int32)
with open("tensor.bin", "wb") as f:f.write(t.numpy().tobytes())
从文件读回 tensor
with open("tensor.bin", "rb") as f:byte_data = f.read()import numpy as np
arr = np.frombuffer(byte_data, dtype=np.int32)
t2 = torch.from_numpy(arr)
print(t2)  # tensor([1, 2, 3, 4], dtype=torch.int32)

你必须记住原始 dtypeshape 才能正确还原!


场景四:构造 batch 时将 list 转为 Tensor

在训练时经常从数据集中拿到多个样本组成 batch(Python list):

samples = [[1.0, 2.0], [3.0, 4.0]]
batch_tensor = torch.tensor(samples, dtype=torch.float32)
print(batch_tensor.shape)  # torch.Size([2, 2])

或者更通用的方式(可以处理动态 shape):

batch_tensor = torch.stack([torch.tensor(s) for s in samples])

补充:在 with torch.no_grad() 中常用转换

推理阶段经常用 Tensor → numpy → list

with torch.no_grad():output = model(input_tensor)pred = output.softmax(dim=1)top1_class = pred.argmax(dim=1).item()

小结对照表

转换类型方法注意事项
Tensor → int/float.item()只能单元素
Tensor → list.tolist()支持嵌套
list → Tensortorch.tensor(list)自动推断类型
Tensor → ndarray.numpy()共享内存
ndarray → Tensortorch.from_numpy(ndarray)共享内存
Tensor → bytestensor.numpy().tobytes()用于存储
bytes → Tensornp.frombuffer + from_numpy需知道 dtype

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87499.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87499.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87499.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络与数据通信基础

第一章 计算机网络概述 1. 计算机网络的核心概念 1.1 定义 将 地理分散 的、具有 独立处理能力 的计算机系统&#xff08;主机/Host&#xff09;&#xff0c;通过 传输介质 与 网络设备 互连&#xff0c;在 网络协议 和 软件 支持下实现 资源共享 与 数据通信 的系统。 关键术…

【统计术语】

文章目录 基础概念术语基期与现期增长量与增长率环比与同比 比重术语平均数术语特殊增长术语其他常用术语 基础概念术语 基期与现期 基期&#xff1a;作为基础参照的时期&#xff0c;一般指过去的时间 现期&#xff1a;与基期对比的时期&#xff0c;一般指现在的时间 示例&am…

XXE(XML外部实体注入)详解

目录 一、XXE漏洞简介 二、XML详解 (一) XML文档结构 1. 文档声明 2. XML文档类型定义&#xff08;DTD&#xff09; 3. XML文档元素 4. XML文档示例 三、XXE漏洞类型 四、XXE漏洞挖掘技巧 五、XXE漏洞危害 (一) 文件读取 (二) 内网探测 1. 端口探测 2. 主机存活探…

深入解析JVM字节码执行引擎

JVM 字节码执行引擎。它是 JVM 核心组件之一&#xff0c;负责实际执行加载到内存中的字节码指令。你可以将它想象成 JVM 的“CPU”。 核心职责&#xff1a; 加载待执行的字节码&#xff1a; 从方法区&#xff08;元空间&#xff09;获取已加载类的方法字节码。创建和管理栈帧…

华为OD机试-MELON的难题-DFS(JAVA 2025A卷)

题意是从N快雨花石中找出最少拿出雨花石的块数&#xff0c;使得雨花石可以均分&#xff0c;直接使用dfs解决此类组合问题 package com.example.demo.bean;import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner;public class YuHuaStone {public s…

鸿蒙数据库操作

一、使用关系型数据库实现数据持久化&#xff0c;需要获取一个RdbStore&#xff0c;其中包括建库、建表、升降级等操作。 const STORE_CONFIG: relationalStore.StoreConfig {name: AnyOffice.db, // 数据库文件名securityLevel: relationalStore.SecurityLevel.S1, // 数据库…

基于ARM SoC的半导体测试

ARM SoC&#xff08;System on Chip&#xff09; 是一种集成了多个关键计算组件的单片系统芯片&#xff0c;广泛应用于移动设备、嵌入式系统、物联网&#xff08;IoT&#xff09;和半导体测试设备等领域。它的核心设计理念是“高度集成”&#xff0c;将处理器、内存、外设接口等…

JavaEE->多线程2

目录 一、线程安全&#xff08;重点&#xff09; 1.线程安全演示 2.线程不安全的原因 1.线程是抢占式执行的&#xff08;执行顺序是随机的&#xff09; 2.多个线程同时修改了同一个变量 3.原子性 4.内存可见性 5.指令重排序&#xff08;有序性&#xff09; 二、解决线…

Flutter TCP通信

启动TCP服务 Future<void> startServer() async {final server await ServerSocket.bind(InternetAddress.anyIPv4, 12345);print(Server listening on ${server.address}:${server.port});server.listen((Socket socket) {print(Client connected: ${socket.remoteAddr…

flask拆分计划

两个启动链接&#xff0c;看日志提示是因为2次启动&#xff0c;一次是database&#xff0c;一次是xmind2&#xff0c;去掉一次就可以&#xff0c;如何去掉一次&#xff1f; 这里启动也调用了一次&#xff0c;所以测试环境注释掉&#xff0c;如下图&#xff0c;也就调用了一次

【生活】ECMO原理、作用、费用及使用方法

博客目录 一、ECMO 是什么&#xff1f;二、ECMO 的作用1. 替代肺功能&#xff08;氧合与二氧化碳清除&#xff09;2. 替代心脏功能&#xff08;循环支持&#xff09;3. 为其他治疗争取时间4. 用于心肺复苏&#xff08;ECPR&#xff09; 三、ECMO 的费用1. 设备使用费2. 耗材费用…

Profinet转EtherCAT网关模块怎么用:案例分享

在某制造工厂西门子S7-1200 PLC中&#xff0c;存在一个技术难题&#xff0c;即伺服驱动器与可编程逻辑控制器&#xff08;PLC&#xff09;之间的通讯不兼容问题。具体而言&#xff0c;PLC采用的是PROFINET通讯协议&#xff0c;而伺服EtherCAT协议驱动器则需要EtherCAT协议进行数…

什么是 NLP-NLP基础知识体系的系统认知

NLP基础知识体系的系统认知 一、引言 今天的学习内容集中于自然语言处理&#xff08;NLP&#xff09;的基本概念、发展历程、核心任务及文本表示技术。通过这一学习过程&#xff0c;我对NLP这门学科有了更加系统和深入的认识&#xff0c;并且理解了NLP技术的广泛应用及其复杂…

数据结构 学习 链表 2025年6月14日08点01分

单向链表: 线性数据结构 由一系列节点组成 每个节点包含: 数据部分:存储实际数据 指针部分:储存指向下一个节点的引用 特点1,每个节点只有一个指向下一个节点的指针 特点2,只能从头到尾 单向遍历 特点3,不需要连续的内存空间 特点4,插入和删除效率高 特点5,随机访问 效率低 …

使用 Kubernetes 部署 PHP 留言板应用(含 Redis 架构)

使用 Kubernetes 部署 PHP 留言板应用&#xff08;含 Redis 架构&#xff09; 文章目录 使用 Kubernetes 部署 PHP 留言板应用&#xff08;含 Redis 架构&#xff09;教程概述技术架构特点 准备工作环境要求 Redis 数据库部署Redis 主从架构原理创建 Redis 领导者 Deployment部…

MATLAB提供的两种画误差矩阵的函数

MATLAB在统计学和机器学习工具包中提供了两种画误差矩阵&#xff08;Confusion matrix&#xff09;的函数。 figure; plotconfusion(YValidation,YPred)figure; cm confusionchart(YValidation,YPred) cm.Title Confusion Matrix for Validation Data; cm.RowSummary row-n…

【Java学习笔记】泛型

泛型 一、泛型的引出 代码示例 public class pra {public static void main(String[] args) {ArrayList arrayList new ArrayList();arrayList.add("java");arrayList.add("jack");arrayList.add("jom");arrayList.add(new a());for (Object…

SpringMVC系列(一)(介绍,简单应用以及路径位置通配符)

0 引言 作者正在学习SpringMVC相关内容&#xff0c;学到了一些知识&#xff0c;希望分享给需要短时间想要了解SpringMVC的读者朋友们&#xff0c;想用通俗的语言讲述其中的知识&#xff0c;希望与诸位共勉&#xff0c;共同进步&#xff01; 1 SpringMVC介绍 SpringMVC本质上…

Java中如何使用lambda表达式分类groupby

Java中如何使用lambda表达式分类groupby Java中如何使用lambda表达式分类groupby分类问题场景传统手写方式lambda使用groupBy()方法一行结束&#xff01;&#xff01;&#xff01;完整代码 Java中如何使用lambda表达式分类groupby 分类问题场景 比如一群学生根据性别和年龄排…

无人机开发分享——无人机集群基于braft实现长机动态推选算法

在无人机集群项目的算法开发中&#xff0c;推选长机作为集群的动态中心&#xff0c;往往承担着集群管理、通讯中继等重要功能。由于通讯链路的有限性和任务的实时性需要&#xff0c;需要保证动态长机时刻工作正常&#xff0c;并在异常情况下快速切换新长机。 本文主要分享基于b…