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

->按行排序,列列对应;按列排序,行行对应。
参数2,参数1,最后再看参数3。
index数值找到确定行/列,再看index位置,确定列/行。

参考:

  1. scatter_()函数的详细介绍:https://blog.csdn.net/weixin_45547563/article/details/105311543
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值