返回顶部
首页 > 资讯 > 后端开发 > Python >Python之维度dim的定义及其理解使用方式
  • 782
分享到

Python之维度dim的定义及其理解使用方式

Python维度dimPythondimPython维度dim的定义 2023-02-02 12:02:30 782人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、dim的定义二、dim 的理解三、举例torch.argmax()  sum()cumsum()总结一、dim的定义 Tensorflow对张量的阶、维度、形状有

一、dim的定义

Tensorflow对张量的阶、维度、形状有着明确的定义,而在pytorh中对其的定义却模糊不清,仅仅有一个torch.size()的函数来查看张量的大小(我理解的这个大小指的就是TensorFlow对张量的形状描述,也和numpy的.shape类似)。

所以,首先要搞清楚如何看一个张量的形状

import torch
z = torch.ones(2,3,4)
print(z)
print(z.size())
print(z.size(0))
print(z.size(1))
print(z.size(2))

以上代码的控制台输出为:

tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],
 
        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])
torch.Size([2, 3, 4])
2
3
4

可见,我们成功创建了一个(2,3,4)大小的张量,那么我们人工应该怎么辨别一个张量的大小呢?

为了直观,我把这个张量的中括号调整一个位置:

[
    [
         [1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]
    ],
 
    [
         [1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]
    ]
]

我们可以看到:

  • 第一层(最外层)中括号里面包含了两个中括号(以逗号进行分割),这就是(2,3,4)中的2
  • 第二层中括号里面包含了三个中括号(以逗号进行分割),这就是(2,3,4)中的3
  • 第三层中括号里面包含了四个数(以逗号进行分割),这就是(2,3,4)中的4

结论:PyTorch中的tensor维度可以通过第一个数前面的中括号数量来判断,有几个中括号维度就是多少。拿到一个维度很高的向量,将最外层的中括号去掉,数最外层逗号的个数,逗号个数加一就是最高维度的维数,如此循环,直到全部解析完毕。

我们还看到:

z.size(0) = 2,z.size(1) = 3,z.size(2) = 4

第0维度为2,第1维度为3,第2维度为4,即维度的标号是以0开始的

二、dim 的理解

网上很多对dim的理解,比如,dim=0,表示的是行,函数的意思就是不要行这一维度,保留列巴拉巴拉之类的,个人觉得不好理解。

比如下图博主的理解

那我的理解就是:

控制变量法大家知道吗??或者消融实验?就是几个方法或者实验的比较,保持只有一个因素是可变的,其他都是一致的,就是控制变量法,论文术语也叫消融实验。

所以,dim的使用也是这样,只有dim指定的维度是可变的,其他都是固定不变的

  • dim = 0,列不变(按列-将当前列所有行数据-计算),指定的是行,那就是行变,理解成:针对每一列中,所有行之间的数据比较或者求和等操作,是每一行的比较,因为行是可变的。
  • dim = 1,行不变(按行-将当前行所有列数据-计算),指定的是列,那就是列变,理解成:针对每一行中,所有列之间的数据比较或者求和等操作,是每一行的比较,因为行是可变的。

三、举例

torch.argmax()  

  •  得到最大值的序号索引
  • dim=0保留列维度,不要行了,保留列的size就可以了
  • dim=1保留行维度,不要列了,保留行的size就可以了
a = torch.rand((3,4))
print(a)
b = torch.argmax(a, dim=1) ##行不变,指定列,列之间的比较,对下面每列数值进行比较,将最大值对应序号存下,比如下面第一列中第一个值最大,为0,第二列中第二个是最大值,为1,第三列同
print(b)
>>tensor([[0.8338, 0.6953, 0.7558, 0.5803],
        [0.2105, 0.7638, 0.0912, 0.3341],
        [0.5585, 0.8019, 0.6590, 0.2268]])
>>tensor([0, 1, 1])

说明:dim=1,指定列,也就是行不变,列之间的比较,所以原来的a有三行,最后argmax()出来的应该也是三个值,第一行的时候,同一列之间比较,最大值是0.8338,索引是0,同理,第二行,最大值的索引是1……

sum()

求和

a = t.arange(0,6).view(2,3)
a
>>tensor([[0, 1, 2],
        [3, 4, 5]])
a.sum()
a.sum(dim=0) #列不变,指定行,行是可变的,对每一列中的所有行之间的数值进行求和,比如这个例子中,第一列0+3,第二列1+4,第三列2+5
a.sum(dim=1) #行不变,指定列,列是可变的,对每一行中的所有列之间的数值进行求和,比如这个例子中,第一行0+1+2,第二行3+4+5
>>tensor(15.)
>>tensor([3., 5., 7.])
>>tensor([ 3., 12.])

说明:dim=0,指定行,行是可变的,列是不变,所以就是同一列中,每一个行的比较,所以a.sum(dim = 0),第一列的和就是3,第二列的和就是5,第三列的和就是7.

同理,a.sum(dim=1),指定列,列是可变的,行是不变的,所以就是同一列之间的比较或者操作,所以第一行的求和是3,第二行的求和是12

cumsum()

累加

a = t.arange(0,6).view(2,3)
a
>>tensor([[0, 1, 2],
        [3, 4, 5]])
a.cumsum(dim=0)  # 指定行,列不变,行变,从第一行到最后一行的累加
>>tensor([[0, 1, 2],
        [3, 5, 7]])
        
a.cumsum(dim=1) # 指定列,行不变,列变,从第一列到最后一列的累加
>>tensor([[ 0,  1,  3],
        [ 3,  7, 12]])

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Python之维度dim的定义及其理解使用方式

本文链接: https://lsjlt.com/news/193935.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python之维度dim的定义及其理解使用方式
    目录一、dim的定义二、dim 的理解三、举例torch.argmax()  sum()cumsum()总结一、dim的定义 TensorFlow对张量的阶、维度、形状有...
    99+
    2023-02-02
    Python维度dim Python dim Python维度dim的定义
  • Vue中自定义标签及其使用方式
    目录问题需求自定义创建组件的vue文件编辑组件使用导入申明使用使用整个代码效果问题 我们在使用Vue开发移动端应用程序时,常常使用Vant Weapp中的组件库,但是我们想过它是怎么...
    99+
    2024-04-02
  • Python使用定时调度任务的方式
    目录1、简单循环 Simple loops2、简单循环但是使用了线程Simple loops but threaded3、定时调度库 Schedule Library4、Python...
    99+
    2024-04-02
  • 使用自定义注解实现加解密及脱敏方式
    目录自定义注解实现加解密及脱敏定义自定义注解构造AOP逻辑测试脱敏逻辑自定义一种字符串的加密与解密自定义注解实现加解密及脱敏 定义自定义注解 @Documented @Targe...
    99+
    2024-04-02
  • Python基础之类的定义和使用详解
    目录1、定义类2、创建类的实例3、“魔术”方法——_ init ()4、创建类的成员并访问4.1、创建实例方法并访问4.2、创建数据成...
    99+
    2024-04-02
  • Python元组的定义及使用方法是什么
    本篇内容主要讲解“Python元组的定义及使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python元组的定义及使用方法是什么”吧!1、前言在Python中元组是一个和列表非常类似...
    99+
    2023-06-25
  • Python列表的定义及使用方法是什么
    这篇文章主要介绍“Python列表的定义及使用方法是什么”,在日常操作中,相信很多人在Python列表的定义及使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python列表的定义及使用方法是什么...
    99+
    2023-06-25
  • spring boot之使用spring data jpa的自定义sql方式
    目录spring data jpa介绍自定义SQL查询jpa两种自定义SQL的方式1. 原生SQL2. 实体类SQLspring data jpa介绍 PA(Java Persist...
    99+
    2024-04-02
  • Python学习之函数的定义与使用详解
    目录函数的定义函数的分类函数的创建方法-def函数的返回值-returnreturn与print的区别函数的传参必传参数默认参数不确定参数(可变参数)参数规则函数小练习函数的参数类型...
    99+
    2024-04-02
  • MySQL时间戳的定义及使用方法详解
    MySQL时间戳的定义及使用方法详解 在MySQL中,时间戳(timestamp)是一种数据类型,用来存储日期和时间信息。时间戳通常用于记录数据的创建时间或最后更新时间,以便对数据进行...
    99+
    2024-04-02
  • css中id和class的定义格式以及使用方法
    本篇内容介绍了“css中id和class的定义格式以及使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • log4j2的异步使用及添加自定义参数方式
    目录log4j2异步使用及添加自定义参数添加依赖(这里省略了版本号)下面写一个生产可用的log4j2.xml的模板补充知识自定义日志格式如何在日志中添加自己想传的参数?log4j 输...
    99+
    2024-04-02
  • 解析vue的provide和inject使用方法及其原理
    首先来谈谈我们为什么要使用provide/inject呢?对于爷爷和孙子组件之间,甚至太爷爷组件与孙子组件通信我们用vuex不就ok了。 那事实的确如此,但是,请听我说但是,有时候你...
    99+
    2024-04-02
  • Mybatis之类型处理器TypeHandler的作用与自定义方式
    目录一、什么是类型处理器1、类型处理器(TypeHandler)2、Mybatis内置了哪些类型处理器二、如何自定义类型处理器1、写个处理器2、配置处理器3、验证处理器总结一、什么是...
    99+
    2023-05-14
    Mybatis类型处理器 Mybatis TypeHandler作用 Mybatis TypeHandler自定义
  • 解析Python中回调函数的原理及使用方式
    Python回调函数的原理和用法解析 回调函数是一种常见的编程技术,尤其在Python中被广泛使用。它可以使我们在异步编程中更加灵活地处理事件和执行任务。本文将对回调函数的原理和用法进行详细解析,并提供具体的代码示例。 一、回调...
    99+
    2024-02-02
    原理解析 用法分析
  • springboot中如何使用自定义注解实现加解密及脱敏方式
    这篇文章主要介绍springboot中如何使用自定义注解实现加解密及脱敏方式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!自定义注解实现加解密及脱敏定义自定义注解@Documented@Target({Element...
    99+
    2023-06-22
  • python如何使用namedtuple和dataclass的方式定义一个类
    这篇文章主要介绍了python如何使用namedtuple和dataclass的方式定义一个类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。...
    99+
    2024-04-02
  • element使用自定义icon图标的两种解决方式
    目录两种情况:第一种情况解决办法:第二种情况解决办法:总结写项目时,发现 element 里的图标没有我需要的图标, 两种情况: ① 简单的替换小图标,没有选中变色等要求 ② 有选中...
    99+
    2024-04-02
  • log4j2的异步使用及添加自定义参数方式是什么
    今天就跟大家聊聊有关log4j2的异步使用及添加自定义参数方式是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。log4j2异步使用及添加自定义参数关于log4j2的性能和原理就不...
    99+
    2023-06-22
  • python列表推导式的原理及使用方法
    偶尔会在python中看见这样一行代码: data = [x**2 for x in range(0, 5)] # 此时data = [0, 1, 4, 9, 16] 如果不知道背后...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作