Pytorch 使用位屏蔽将数据从一个张量复制到另一个张量

Pytorch 使用位屏蔽将数据从一个张量复制到另一个张量,pytorch,Pytorch,火炬尺寸([2])张量([0,7,0,9,0.])) 我正在努力理解它是如何工作的。我最初认为上面的代码使用了奇特的索引,但我意识到c张量中的值会被复制到标记为1的索引中。另外,如果我没有将b的数据类型指定为uint8,则上述代码不起作用。有人能给我解释一下上面代码的机制吗。使用数组进行索引的工作原理与我所知道的numpy和大多数其他矢量化数学软件包的工作原理相同。有两种情况: 当b类型为uint8(想想布尔值,pytorch不会将bool与uint8)区分开来,a[b]是一个一维数组,包含a(

火炬尺寸([2])
张量([0,7,0,9,0.]))


我正在努力理解它是如何工作的。我最初认为上面的代码使用了奇特的索引,但我意识到c张量中的值会被复制到标记为1的索引中。另外,如果我没有将b的数据类型指定为uint8,则上述代码不起作用。有人能给我解释一下上面代码的机制吗。

使用数组进行索引的工作原理与我所知道的numpy和大多数其他矢量化数学软件包的工作原理相同。有两种情况:

  • b
    类型为
    uint8
    (想想布尔值,pytorch不会将
    bool
    uint8
    )区分开来,
    a[b]
    是一个一维数组,包含
    a
    a[i]
    )的值子集,对应的in
    b
    b[i]/code>)为非零。这些值的别名为原始
    a
    ,因此,如果修改它们,它们相应的位置也将更改

  • 可用于索引的另一种类型是
    int64
    数组,在这种情况下
    a[b]
    创建一个shape
    数组(*b.shape,*a.shape[1:])
    。它的结构就像是
    b
    b[i]
    )的每个元素都被
    a[i]
    替换。换句话说,您可以通过指定从
    a
    的哪些索引中提取数据来创建一个新数组。同样,这些值与原始的
    a
    有别名,因此如果修改
    a[b]
    ,则每个
    i
    a[b[i]
    的值都会发生变化。本文给出了一个示例用例

  • 这两种模式在和中对numpy进行了说明,对于后者,您必须记住pytorch使用
    uint8
    代替
    bool


    此外,如果您的目标是将数据从一个张量复制到另一个张量,那么您必须记住,像
    a[ixs]=b[ixs]
    这样的操作是就地操作(
    a
    就地修改),这在autograd中不起作用。如果要进行不合适的遮罩,请使用。答案中显示了一个示例用例

    感谢您的解释。您能为您在上面解释的阵列的行为提供任何文档吗。这两个相关的段落是和,对于后者,您必须记住pytorch使用
    uint8
    代替
    bool
    。我扩展了我的回答,还提到了
    torch。如果您想在张量之间复制数据,这可能是实际的解决方案。
    
    import numpy as np
    import torch
    a = torch.zeros(5)
    b = torch.tensor(tuple((0,1,0,1,0)),dtype=torch.uint8)
    c= torch.tensor([7.,9.])
    print(a[b].size())
    a[b]=c
    print(a)