Pytorch - 张量转换拼接

目录

张量转换为 numpy 数组

numpy 转换为张量

标量张量和数字的转换

张量拼接操作

张量索引操作


😆😆😆感谢大家的观看😆😆😆

张量转换为 numpy 数组

🔎使用 Tensor.numpy 函数可以将张量转换为 ndarray 数组,但是共享内存,可以使用 copy 函数避免共享。

data_tensor = torch.tensor([2, 3, 4])
# 使用张量对象中的 numpy 函数进行转换
data_numpy = data_tensor.numpy()print(type(data_tensor))
print(type(data_numpy))# 修改其中的一个,另外一个也会发生改变!
# data_tensor[0] = 100
data_numpy[0] = 100print(data_tensor)
print(data_numpy)

我们可以通过对象拷贝避免共享内存:

data_tensor = torch.tensor([2, 3, 4])
# 使用张量对象中的 numpy 函数进行转换
data_numpy = data_tensor.numpy().copy()print(type(data_tensor))
print(type(data_numpy))# data_tensor[0] = 100
data_numpy[0] = 100
print(data_tensor)
print(data_numpy)

numpy 转换为张量

  1. 使用 from_numpy 可以将 ndarray 数组转换为 Tensor,默认共享内存,使用 copy 函数避免共享。
  2. 使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存。
def test01():data_numpy = np.array([2, 3, 4])data_tensor = torch.from_numpy(data_numpy)# 共享内存# data_numpy[0] = 100data_tensor[0] = 100print(data_tensor)print(data_numpy)# 使用 torch.tensor 函数
def test02():data_numpy = np.array([2, 3, 4])data_tensor = torch.tensor(data_numpy)# 不共享内存# data_numpy[0] = 100data_tensor[0] = 100print(data_tensor)print(data_numpy)

标量张量和数字的转换

🔎对于只有一个元素的张量(shape没有限制,元素只有一个),使用 item 方法将该值从张量中提取出来。 

data = torch.tensor([30,])
print(data.item())data = torch.tensor(30)
print(data.item())data = torch.tensor([[30]])
print(data.item())# 30
# 30
# 30

张量拼接操作

⚔️张量的拼接方式有两种:CAT、STACK

  • CAT方法是将两个张量按照某一维度进行拼接(类似于积木拼接)
  • STACK方法是将两个张量按照顺序垂直堆叠起来。
  • STACK 方法主要用于将多个张量垂直堆叠在一起,形成一个新的、更高维度的张量。这在需要将来自不同来源或具有不同特征集的数据整合到一起时非常有用,例如在处理时间序列数据或多通道图像数据时。而 CAT 方法则是在同一维度上水平拼接张量,适用于需要扩展特征空间宽度的情况~

torch.cat()   该函数接受两个参数:输入张量列表和拼接的维度。以下是一个简单的示例:

import torch# 创建两个张量
tensor1 = torch.tensor([[1, 2], [3, 4]])
tensor2 = torch.tensor([[5, 6], [7, 8]])# 沿着第0维(行)拼接张量
result = torch.cat((tensor1, tensor2), dim=0)
print(result)
# 输出:
# tensor([[1, 2],
#         [3, 4],
#         [5, 6],
#         [7, 8]])# 沿着第1维(列)拼接张量
result = torch.cat((tensor1, tensor2), dim=1)
print(result)
# 输出:
# tensor([[1, 2, 5, 6],
#         [3, 4, 7, 8]])

我们可以打印每个张量的shape,来观察一下拼接所发生的变化:依次类推dim:0,1,2位置

import torch
data1 = torch.randint(0, 10, [3, 5, 4])
data2 = torch.randint(0, 10, [3, 5, 4])
data1.cuda()
data2.cuda()
new_data = torch.cat([data1, data2], dim=0)
print(new_data.shape)
# 结果:torch.Size([6, 5, 4])

torch.stack() 

⚔️torch.stack函数用于将一系列张量堆叠到一个新的维度

torch.stack的使用场景通常包括需要增加数据的一个维度时。比如在处理图像数据或者文本数据的时候,我们经常需要把二维的数据转换为三维的,这时候就可以使用torch.stack来完成这个操作。使用torch.stack可以保留两个信息:序列和张量矩阵信息。当我们需要把一系列的二维张量转换为三维的张量时,可以使用torch.stack来实现。例如,如果我们有两个形状为(3, 3)的二维张量A和B,我们可以通过指定dim=0来在它们的最前面增加一个新的维度,结果张量的形状就会变为(2, 3, 3)。这表明在新的维度上,张量的个数是2,其它两个维度的大小保持不变。

torch.cat的区别主要在于,torch.cat是在现有的维度上进行拼接

这意味着使用torch.cat时,输入的张量必须在除了拼接维度外的所有其他维度上具有相同的大小。而torch.stack则要求所有输入张量在所有维度上的大小都相同。此外,torch.cat不会增加张量的总维度数量,它仅仅是在一个指定的维度上扩展了张量的大小。例如,如果我们有两个形状为(2, 2, 3)的张量,当我们对它们应用torch.cat(dim=0)时,结果张量的形状会是(4, 2, 3),这里的4表示在指定的维度上,元素的数量从原来的2个扩展到了4个。

import torch# 创建两个形状为(3, 3)的张量A和B
A = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
B = torch.tensor([[10, 11, 12],[13, 14, 15], [16, 17, 18]])# 使用torch.stack将A和B堆叠成一个新的维度,dim=0表示在最前面增加新的维度
C = torch.stack((A, B), dim=0)
print(C)tensor([[[ 1,  2,  3],[ 4,  5,  6],[ 7,  8,  9]],[[10, 11, 12],[13, 14, 15],[16, 17, 18]]])

我们可以再观察dim=1表示在第二个维度上进行堆叠。

import torchA = torch.tensor([[1, 2, 3],[4, 5, 6]])
B = torch.tensor([[7, 8, 9], [10, 11, 12]])C = torch.stack((A, B), dim=1)tensor([[[ 1,  2,  3],[ 7,  8,  9]],[[ 4,  5,  6],[10, 11, 12]]])

我们可以再观察dim=2表示在第三个维度上进行堆叠。

data1= torch.randint(0, 10, [2, 3])
data2= torch.randint(0, 10, [2, 3])
new_data = torch.stack([data1, data2], dim=2)
print(new_data)tensor([[[5, 6],[6, 0],[9, 2]],[[5, 1],[9, 4],[0, 1]]])

张量索引操作

张量索引操作允许我们对多维数组中的元素进行访问和操作。张量索引操作是处理多维数据的基础,它不仅能够让我们访问和修改数据,还能够帮助我们实现各种复杂的数据操作和算法。

我们来看一下张量索引基本操作:

🏹简单行、列索引

import torchdata = torch.randint(0, 10, [4, 5])
print(data)tensor([[0, 7, 6, 5, 9],[6, 8, 3, 1, 0],[6, 3, 8, 7, 3],[4, 9, 5, 3, 1]])
  • data[0]    --- tensor([0, 7, 6, 5, 9])
  • data[:, 0] --- tensor([0, 6, 6, 4])
  • data[[0, 1], [1, 2]] :返回 (0, 1)、(1, 2) 两个位置的元素(tensor([7, 3]))
  • data[[[0], [1]], [1, 2]]  : 返回 0、1 行的 1、2 列共4个元素 (tensor([[7, 6], [8, 3]]))

🏹范围索引 

# 前3行的前2列数据
print(data[:3, :2])
# 第2行到最后的前2列数据
print(data[2:, :2])tensor([[0, 7],[6, 8],[6, 3]])
tensor([[6, 3],[4, 9]])

🏹布尔索引

# 第三列大于5的行数据
print(data[data[:, 2] > 5]) # data[:, 2] > 5返回了按照这个规则的一列布尔值,再套入到data求出来
类似于pandas求所有行的某一维度>5的所有行
# 第二行大于5的列数据
print(data[:, data[1] > 5])tensor([[0, 7, 6, 5, 9],[6, 3, 8, 7, 3]])
tensor([[0, 7],[6, 8],[6, 3],[4, 9]])

🏹多维索引

data = torch.randint(0, 10, [3, 4, 5])
print(data)
print('-' * 50)print(data[0, :, :])
print(data[:, 0, :])
print(data[:, :, 0])结果:
tensor([[[2, 4, 1, 2, 3],[5, 5, 1, 5, 0],[1, 4, 5, 3, 8],[7, 1, 1, 9, 9]],[[9, 7, 5, 3, 1],[8, 8, 6, 0, 1],[6, 9, 0, 2, 1],[9, 7, 0, 4, 0]],[[0, 7, 3, 5, 6],[2, 4, 6, 4, 3],[2, 0, 3, 7, 9],[9, 6, 4, 4, 4]]])
--------------------------------------------------
tensor([[2, 4, 1, 2, 3],[5, 5, 1, 5, 0],[1, 4, 5, 3, 8],[7, 1, 1, 9, 9]])
tensor([[2, 4, 1, 2, 3],[9, 7, 5, 3, 1],[0, 7, 3, 5, 6]])
tensor([[2, 5, 1, 7],[9, 8, 6, 9],[0, 2, 2, 9]])

💥我们下期一起学习张量的高阶操作💥

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

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

相关文章

Gradle JDK 和项目JDK的区别

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget “1.8” } 在Android项目中,compileOptions和kotlinOptions的配置与Gradle所使用的JDK版本没有直接冲突。这些选项是用…

MySQL 使用C语言

一般使用MySQL很少用命令行,一般都是通过程序内部使用,MySQL也为不同的语言定制了不同的头文件和库函数,可以在自己的程序中通过包含头文件和编译时候链接库函数来使用MySQL。 现在一般安装MySQL的时候就会自动给你安装库函数和头文件。 可…

数据资产管理制度探索——浙江篇

在行政事业单位数据资产管理领域,浙江省以创新性思维与高质量发展的战略眼光,积极探索并构建了具有前瞻性和实效性的数据资产管理制度。作为财政部数据资产管理试点省份,浙江省财政厅与省标准化研究院强强联合,充分运用数据溯源、…

【报错】TypeError: Cannot read property ‘meta‘ of undefined

😈解决思路 首先这里很明显我们能看到是缺少该参数:meta。 但是经过查找后发现和该参数无关。 😈解决方法 后来我上网搜了下,网上的回答大部分偏向于是package.json这个文件中的tabBar.list数组对象只有一条的问题。 网上的大…

基于SpringBoot + Vue实现的租房管理系统设计与实现+毕业论文+开题报告​(包运行成功)

介绍 管理员的主要功能设计为:密码信息管理、注册用户管理、区域管理、出租管理等模块。 房主的主要功能设计为:密码信息管理、个人信息管理、订单管理等模块。 用户的主要功能设计为:用户登录、密码管理、出租管理、收藏管理等模块。 源码论…

数据结构---线性表

1&#xff0c;顺序表实现---动态分配 #include<stdlib.h> #define InitSize 10 typedef struct {int *data;//静态分配int length;int MaxSize; }SqList; void InitList(SqList& L) {L.data (int*)malloc(InitSize * sizeof(int));//分配空间L.length 0;L.MaxSize…

编译 dtbocfg 模块是遇到的问题

编译 dtbocfg 模块 报错1 在编译 dtbocfg.c CC [M] /home/book/imx6ull/kernal_modul/00_dtbocfg/dtbocfg.o /home/book/imx6ull/kernal_modul/00_dtbocfg/dtbocfg.c:253:1: warning: data definition has no type or storage classCONFIGFS_ATTR(dtbocfg_overlay_item_, dt…

【测试开发学习历程】python常用的模块(上)

前言&#xff1a; 感觉全是机器人给我点赞和收藏&#xff08;QWQ&#xff09;&#xff0c;能不能来个活人评论我啊&#xff0c;行行好&#xff08;QAQ&#xff09; 目录 1 模块的导入 2 随机模块-random 3 字符串模块-string 4 os模块及其常用函数 1 模块的导入 库、包、…

关于SpringCloud,你了解多少?

Why SpringCloud&#xff1f; Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用 spring boot 的开发风格做到一…

C++ 标准库中的 <algorithm> 头文件

C 标准库中的 <algorithm> 头文件包含了一系列非常有用的算法函数&#xff0c;这些函数可以用于处理容器&#xff08;如向量、列表、数组等&#xff09;中的元素。这些算法可以极大地简化编程任务&#xff0c;使代码更加简洁和易于理解。 以下是一些 <algorithm> …

论坛直击|发展新质生产力,高校怎么做?

新质生产力浪潮涌动 三大议题聚焦高校人才培养 今年全国两会的政府工作报告将“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”列在2024年政府工作任务首位&#xff0c;发展新质生产力的先导是培养拔尖创新人才&#xff0c;高等教育改革必须以立德树人为根本任…

带你从BIOS 小工到年薪百万 之 sense amplifier 的作用以及MRC 如何初始化它

做过BIOS 的同学&#xff0c;肯定看过这张图片 对世界充满好奇心的你&#xff0c;是否想过 其中 Sense amplifier 是做什么用的&#xff1f; 是如何工作的&#xff1f; BIOS 又是如何训练它的&#xff1f; 明天接着写

[C++11] 初始化语法、explicit关键字、final override关键字、delete default关键字

说明&#xff1a;C11 引入了初始化语法、explicit关键字、final && override关键字、delete && default关键字 等新特性&#xff0c;旨在改善语言的功能性、安全性和表达能力。具体说明如下&#xff1a; 引入初始化列表和统一的初始化语法的原因&#xff1a;在…

分布式的计算框架之Spark(python第三方库视角学习PySpark)

基本介绍 Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎 。现在形成一个高速发展应用广泛的生态系统。 特点介绍 Spark 主要有三个特点&#xff1a; 首先&#xff0c;高级 API 剥离了对集群本身的关注&#xff0c;Spark 应用开发者可以专注于应用所要做的计…

transformer在生物基因DNA的应用:DNABERT、DNABERT-2

参考&#xff1a; https://www.youtube.com/watch?vmk-Se29QPBA&t1388s 写明这些训练模型可以最终训练好可以进行DNA特征向量的提取&#xff0c;应用与后续1、DNABERT https://github.com/jerryji1993/DNABERT 主要思路就是把DNA序列当成连续文本数据&#xff0c;直接用…

维修伊顿触摸屏不显示工业电脑人机界面EATON XVS-430-10MPI-1-10 深圳捷达工控维修

人机界面 (HMI) XP500 工业 PC 系列 以不同的方式思考工业平板电脑 对于严酷、高要求的应用&#xff0c;工业平板电脑设定了可配置性和稳健性的标准。伊顿的 XP500 系列工业平板电脑凭借防刮钢化玻璃屏幕、铸铝外壳和无风扇设计满足了这些需求。这些功能使 XP500 HMI成为一款节…

ES11-12

1-ES11-Promise.allSettled Promise.allSettled0)方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。 简单来说不管成功失败都会调用.then()&#xff0c;然后处理成功和失败的结果 const promises [ …

项目4-图书管理系统2+统一功能处理

1. 拦截器&#xff08;Interceptor&#xff09; 我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现⽅法是比较麻烦的。 所需要处理的内容&#xff1a; • 需要修改每个接⼝的处理逻辑 • 需要修改每个接⼝的返回结果 • 接⼝定义修改, 前端代码也需…

使用moviepy进行音视频处理(超全面)

在这篇博客中,我们将探讨如何使用Python处理视频文件,包括读取视频参数、剪切视频片段、合并视频片段、裁剪视频以及调整视频大小等功能。这些功能可以广泛应用于视频编辑、视频处理等场景。 1. 视频参数获取 首先,我们定义了一个 video_parameters 函数,用于读取视频文件的一…

淘宝商品详情API数据采集接口|如何快速采集淘宝商品数据?

如何快速采集淘宝商品数据 无论是谁&#xff0c;如果单凭人工的方式去收集淘宝、天猫等平台的商品数据信息&#xff0c;工作量是巨大的&#xff0c;如果借助有采集软件的第三方公司操作&#xff0c;则可实现对大数据的轻松掌握&#xff0c;但是外包给第三方公司需要支付一定的…