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