首页 > 其他分享 >pytorch中的张量函数

pytorch中的张量函数

时间:2024-03-26 11:44:23浏览次数:25  
标签:dim 函数 torch 张量 shape print pytorch 维度

troch.cat()& torch.stack()

.cat 和 .stack的区别在于 cat会增加现有维度的值,可以理解为续接,stack会新加增加一个维度,可以理解为叠加

x1 = torch.tensor([[11, 21, 31], [21, 31, 41]], dtype=torch.int)
x2 = torch.tensor([[12, 22, 32], [22, 32, 42]])
inputs = [x1, x2]
R0 = torch.cat(inputs, dim=0)
print("R0:\n", R0)
print("R0.shape:\n", R0.shape)
R = torch.stack((x1, x2), dim=0)
print("R:\n", R)
print("R.shape:\n", R.shape)
print(R==R0)# 会报错

输出如下:

R0:
 tensor([[11, 21, 31],
        [21, 31, 41],
        [12, 22, 32],
        [22, 32, 42]])
R0.shape:
 torch.Size([4, 3])
R:
 tensor([[[11, 21, 31],
         [21, 31, 41]],

        [[12, 22, 32],
         [22, 32, 42]]])
R.shape:
 torch.Size([2, 2, 3])

torch.nn.cat()和torch.nn.stack()是PyTorch中用于处理张量的两个常用函数,它们在拼接和堆叠张量时有一些区别。让我们来详细了解一下:

torch.nn.cat():
可以理解为“拼接”操作。
可以按行或按列拼接张量。
操作后得到的张量维度不会增加。
要求用来拼接的张量形状匹配(非拼接维度必须一致)。
示例代码:

import torch
import numpy as np

a = torch.from_numpy(np.arange(0, 12).reshape(3, 4))
b = torch.from_numpy(np.arange(0, 12).reshape(3, 4))

# 按行拼接
c0 = torch.cat((a, b), dim=0)
print(f'按行拼接结果:\n{c0}')

# 按列拼接
c1 = torch.cat((a, b), dim=1)
print(f'按列拼接结果:\n{c1}')

按行拼接要求两个张量的列数必须一致,按列拼接要求两个张量的行数必须一致。
torch.nn.stack():
可以理解为“堆叠”操作。
操作后得到的张量会增加一维。
用来堆叠的张量形状必须完全一致。
示例代码:
三种可能的堆叠方式,分别对应dim=0, 1, 2


s0 = torch.stack((a, b), dim=0)
s1 = torch.stack((a, b), dim=1)
s2 = torch.stack((a, b), dim=2)

print(f'按dim=0堆叠结果:\n{s0}')
print(f'按dim=1堆叠结果:\n{s1}')
print(f'按dim=2堆叠结果:\n{s2}')

二维张量有三种可能的堆叠方式,分别对应dim=0, 1, 2。
总结:

torch.nn.cat()用于拼接,不增加维度。
torch.nn.stack()用于堆叠,增加一维。1 2 3

quezze()&unquezze()

在 PyTorch 中,unsqueeze() 和 squeeze() 是两个常用的函数,用于调整张量的维度。让我详细解释一下它们的作用和用法:

torch.squeeze() 函数:
torch.squeeze(A, N) 的作用是减少数组 A 指定位置 N 的维度。
如果不指定位置参数 N,则会删除数组 A 中所有维度为 1 的维度。
举例:
如果数组 A 的维度为(1,1,3),执行 torch.squeeze(A, 1) 后,A 的维度变为(1,3),中间的维度被删除。
注意:
如果指定的维度大于 1,操作将无效。
如果不指定维度 N,将删除所有维度为 1 的维度。
torch.unsqueeze() 函数:
torch.unsqueeze(A, N) 的作用是在数组 A 的指定位置 N 增加一个维度。
例如,对于一个两行三列的数组 A,有三个位置可以增加维度,分别是:
位置 0:(2,3)
位置 1:(2,3)
位置 2:(2,3)
如果执行 torch.unsqueeze(A, 1),数据的维度将变为(2,1,3)。
代码示例:

import torch

# squeeze函数
a = torch.randn(1, 1, 3)
print("原始维度:", a.shape)
b = torch.squeeze(a)
print("去除中间维度:", b.shape)
c = torch.squeeze(a, 0)
print("去除第一个维度:", c.shape)
d = torch.squeeze(a, 1)
print("去除第二个维度:", d.shape)
e = torch.squeeze(a, 2)  # 如果去掉第三维,则数不够放了,所以直接保留
print("去除第三个维度:", e.shape)

# unsqueeze函数
f = torch.randn(1, 3)
print("原始维度:", f.shape)
g = torch.unsqueeze(f, 0)
print("在第一个位置增加维度:", g.shape)
h = torch.unsqueeze(f, 1)
print("在第二个位置增加维度:", h.shape)
i = torch.unsqueeze(f, 2)
print("在第三个位置增加维度:", i.shape)

torch.permute()

重新布局

Reference

标签:dim,函数,torch,张量,shape,print,pytorch,维度
From: https://www.cnblogs.com/guanghui-hua/p/18096301

相关文章

  • SQL-部分函数替代
    SQL-优化部分函数替代方案:LIKE替换1.MSSQL替代函数MSSQL语法selectCHARINDEX(‘Zhang’,‘Devil_Zhang’)运行结果:72.MySQL替代函数MySQL语法selectinstr('Devil_Zhang','Zhang')运行结果:73.Oracle替代函数SELECT INSTR('012134','0121')FROMDUAL;运行......
  • 还写那么多函数?js简单封装,拿去用吧
    ;(function($){ varwprtTheme={ //Maininitfunction init:function(){ this.config(); this.events(); }, //Definevarsforcaching config:function(){ ......
  • Go的可变参数函数
    可变函数是指可以接收可变数量的参数的函数。在Golang中,可以传递与函数签名中引用的类型相同的不同数量的参数。在声明可变函数时,最后一个参数的类型前会有一个省略号"...",这表明该函数可以用任意数量的该类型参数来调用,可以是0个、1个或者多个。这种类型的函数在不知道传递给......
  • 肖sir__python之函数5.1
    函数:一、什么是函数定义:函数是组织好,可重复使用,用来实现单一,或关联功能的代码段二、pycharm中的表结构项目,包(init)或目录,py文件,py文件包含多个函数或类等    三、函数的有哪些优点?1、降低代码冗余2、增加代码的复用性,提高开发效率3、提高程序的拓展性4、封装:就是......
  • c语言应用,函数综合应用(2)
    c语言刚开始学习的时候,一般来说,我们如果只是在一个源文件里面编程,那么我们都会将包装的模块化函数都放在上面,把主函数放在下面的位置,目的是为了让编译软件知道主函数里调用的函数位置但是,若是我们将这些包装的模块化函数放在主函数的下面会发生什么情况呢?虽然程序依然可以继续......
  • C++缺省参数与函数重载
    1.缺省参数1.1定义即函数声明或定义时为函数指定一个缺省值,如果调用函数时传入参数,则变量的值为实参的值,如果调用时未传入参数,则变量的值为缺省值。//其中a=0即为定义的缺省值voidFun_test(inta=0){ cout<<"a="<<a<<endl;}intmain(){//传入参数,a......
  • C语言-内存函数
    文章目录1.memcpy1.1.memcpy语法形式1.2.memcpy的模拟实现2.memmove2.1.memmove的语法形式2.2.memmove的模拟实现3.memset3.1.memset的语法形式4.memcmp4.1.memcmp的语法形式1.memcpy1.1.memcpy语法形式void*memcpy(void*destinotion,const*source,size_tnu......
  • 函数‘select’标签‘"data.frame"’找不到继承方法
     001、R语言中出现如下报错>a<-1:5>b<-letters[1:5]>test<-data.frame(a,b)>library(dplyr)>select(test,a)Errorin(function(classes,fdef,mtable):函数‘select’标签‘"data.frame"’找不到继承方法##此处报错 002、原因分......
  • 【笔记】普通生成函数
    【笔记】普通生成函数0前置芝士0.1等比数列因为我不会,所以在这里提一嘴。\(a_i=a_{i-1}q\Rightarrowa_i=a_1q^{i-1}\)\(S=\sum\limits_{i=1}^na_i\RightarrowqS=\sum\limits_{i=2}^{n+1}a_i=S-a_{n+1}+a_1\)\(\RightarrowS=\dfrac{a_1(q^n-1)}{q-1}\)​0.2泰勒级......
  • 三角函数
    前置弧度制。具体地,\(2\pi=360^\circ\)神秘东西\(\sin(\alpha)+\cos(\alpha)\)\[\begin{aligned}&\cos(\alpha)+\sin(\alpha)\\=&\sqrt{2}\cos(\alpha-\frac{\pi}{4})=&\sqrt{2}\sin(\alpha+\frac{\pi}{4})\end{aligne......