pytorch之scatter_的用法及说明

 更新时间:2023年09月11日 11:21:36   作者:czg792845236  
这篇文章主要介绍了pytorch之scatter_的用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

pytorch scatter_的用法

scatter_(input, dim, index, src)将src中数据根据index中的索引按照dim的方向填进input中

这个函数可以从转换成onehot编码来理解。

看下面代码:

index = torch.tensor([1,2,1,2,0])
torch.zeros(5,3).scatter_(1, index.unsqueeze(1), 1)  
# tensor([[0., 1., 0.],
#         [0., 0., 1.],
#         [0., 1., 0.],
#         [0., 0., 1.],
#         [1., 0., 0.]])

简要说明

这段代码的目的就是将李表[1,2,1,2,0]转成one-hot编码的形式。

因为有5个数据,然后数值范围从0~2,所以需要设置3列,所以目标矩阵应该是5x3。

scatter_ 中第一个1表示沿着维度1的方向也就是列的方向,第二个参数表示需要填值的索引,第三个参数表示填的值。

比如以输出结果的第一行为例,原本 torch.zeros 使得第一行的元素都是0,但是 scatter_ 的第二个输入参数第一行是1(因为经过unsqueeze后第一行只有一个元素了),所以输出结果的第一行的第1个元素(从0开始)应该填上 scatter 最后一个参数所表示的值,剩下的以此类推。

不过其实得到onehot编码可以用pandas.get_dummies

index = [1,2,1,2,0]
pd.get_dummies(index)

.scatter_函数

.scatter_函数放置元素或者修改元素。

>>> x = torch.rand(2, 5)
>>> x
tensor([[0.6132, 0.8931, 0.7345, 0.6793, 0.6606],
        [0.0630, 0.1785, 0.7312, 0.6456, 0.6307]])
>>> torch.zeros(3, 5).scatter_(0, torch.LongTensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), 1)
tensor([[1., 1., 1., 1., 1.],
        [0., 1., 0., 1., 0.],
        [1., 0., 1., 0., 1.]])
>>> torch.zeros(3, 5).scatter_(0, torch.LongTensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), x)
tensor([[0.6132, 0.1785, 0.7312, 0.6793, 0.6606],
        [0.0000, 0.8931, 0.0000, 0.6456, 0.0000],
        [0.0630, 0.0000, 0.7345, 0.0000, 0.6307]])

torch.zeros(3,5),先创建一个3行5列的全为0的tensor,后续使用scatter函数往里放置元素,如何放置按照参数1和参数2的规定,放置哪些元素,按照参数3的规定。

具体来说

上述.scatter_(参数1,参数2,参数3)中,参数0/1表示,按行/列进行元素的放置(维度再高类比扩展),参数2用于找索引(找torch.zeros中位置),参数3为希望放入的元素。例如当参数3为x的时候,torch.zeros(3,5)中填入的为x中的元素;当参数3为1的时候,形成的tensor中为1,即表示希望放入的元素为1。

如何放置,先从简单的,放置的元素为1开始:

第一步,先看参数2,找index。

参数2的值是一个tensor:

[[0, 1, 2, 0, 0],
[2, 0, 0, 1, 2]]

例如,其中第1行第0列(1,0)的值为2,即index=2。

第二步,根据index确定行/列,看参数1。

本例中参数1为0,按放置,因此在torch.zeros(3,5)的第2行(注意从0开始)填入1,那么,在第2行(从0开始)的哪一列填入1呢,需要遵循的原则是:第一步中index所在位置为第1列,因此放入第1列。因此在torch.zeros(3,5)的(2,1)位置上放入1。

即往torch.zeros(3,5)中填入元素的时候,torch.zeros(3,5)中元素的列与x的列是相同的,这一点当x是具体数值的时候比较清晰。可以看出x的列与torch.zeros(3,5)最后填完之后的列中的元素是对应的,比如第1列的元素不会跑到第2列去,但是行不一定。

那么,复杂一点,如果放置的元素不是1,而是需要把x中的元素放入呢。增加第三步,目前已经找到参数2中 (1,0) 的index是2了,再看参数3,此时参数3为x,在x中找 (1,0) 位置上的元素是0.0630,因此这时候在第二步中,放入第1行第0列的元素不是1,而是0.0630。因此在torch.zeros(3,5)的(2,1)位置上放入0.0630。

Note:

  • 第二步中,如果参数=1,表示按行放置,则先确定行再确定列;如果参数=0,表示按列放置,则先确定列再确定行。
  • 本例中因为是按行放置,要求torch.zeros(3,5)的列与x的列是相同的,否则没法做到列列对应;如果是按列方式,则要求【被填入的torch】与x的行是相同的,否则没法做到行行对应。
  • 参数2中的值控制的是【被填入的torch】的x行或者x列,因此参数2中的最大值,不应该超过【被填入的torch】的行/列(按列排序/按行排序)–>参数2控制位置。

->按行排序,列列对应;按列排序,行行对应。

参数2,参数1,最后再看参数3。

index数值找到确定行/列,再看index位置,确定列/行。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年

    手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年

    最近很多网友找小编反映PyCharm激活码失效了,原来的已经不能用了。浪费了半天时间终于找到一个可以使用的了,支持最新JetBrains全系列产品(Pycharm 2020.2.x,Intellij idea 2020.2.x,WebStorm 2020.2.x)。,需要的朋友可以参考下
    2020-10-10
  • Python删除空文件和空文件夹的方法

    Python删除空文件和空文件夹的方法

    这篇文章主要介绍了Python删除空文件和空文件夹的方法,涉及Python针对文件与文件夹的遍历、判断与删除等技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 对Python 简单串口收发GUI界面的实例详解

    对Python 简单串口收发GUI界面的实例详解

    今天小编就为大家分享一篇对Python 简单串口收发GUI界面的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python3删除排序数组中重复项的方法分析

    Python3删除排序数组中重复项的方法分析

    这篇文章主要介绍了Python3删除排序数组中重复项的方法,结合实例形式分析了Python3删除排序数组重复项的原理、相关遍历及删除操作技巧,需要的朋友可以参考下
    2019-01-01
  • python3实现全角和半角字符转换的方法示例

    python3实现全角和半角字符转换的方法示例

    在自然语言处理过程中,全角、半角的的不一致会导致信息抽取不一致,因此需要统一,下面这篇文章主要给大家介绍了关于python3中全角和半角字符转换的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • Python pandas中to_sql的使用及问题详解

    Python pandas中to_sql的使用及问题详解

    今天在使用 Pandas 的 to_sql 方法时,遇到一些问题,所以下面这篇文章主要给大家介绍了关于Python pandas中to_sql的使用及问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • python图形用户界面tkinter之按钮Button的使用说明

    python图形用户界面tkinter之按钮Button的使用说明

    这篇文章主要介绍了python图形用户界面tkinter之按钮Button的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Python内置函数 next的具体使用方法

    Python内置函数 next的具体使用方法

    这篇文章主要介绍了Python内置函数 next的具体使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Python实现数据的序列化操作详解

    Python实现数据的序列化操作详解

    在日常开发中,对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块。本文就为大家详细讲解这两个模块的使用,需要的可以参考一下
    2022-07-07
  • 基于Python编写一个微博抽奖小程序

    基于Python编写一个微博抽奖小程序

    本文将利用Python编写一个微博抽奖小程序,梦想总是要有的,万一靠在微博上自动抽奖暴富了呢~文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-05-05

最新评论