Python 使用表示索引的1D长张量选择3D Pytorch张量的特定索引

Python 使用表示索引的1D长张量选择3D Pytorch张量的特定索引,python,pytorch,tensor,Python,Pytorch,Tensor,我有一个张量,是mxbxc,其中M是模型的数量,B是批次,C是类,每个单元是给定模型和批次的一个类的概率。然后我有一个正确答案的张量,它就是一个1D,大小为B,我们称之为t。如何使用大小为B的1D返回一个M x B x 1,其中返回的张量只是正确类中的值?假设M x B x C张量叫做布拉,我试过了 blah[:, :, C] for i in range(M): blah[i, :, C] blah[:, C, :] 顶部2只返回每个切片的第三维索引t的值。最后一个返回第二维度中

我有一个张量,是mxbxc,其中M是模型的数量,B是批次,C是类,每个单元是给定模型和批次的一个类的概率。然后我有一个正确答案的张量,它就是一个1D,大小为B,我们称之为t。如何使用大小为B的1D返回一个M x B x 1,其中返回的张量只是正确类中的值?假设M x B x C张量叫做布拉,我试过了

blah[:, :, C]

for i in range(M):
    blah[i, :, C]

blah[:, C, :]

顶部2只返回每个切片的第三维索引t的值。最后一个返回第二维度中t索引处的值。我如何做到这一点?

我们可以通过

进口火炬 形状[2,3,4] 布拉=火炬张量[ [[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]] 形状[3] t=火炬张量[2,1,0] b=torch.arangeblah.shape[1]。类型为 形状[2,3,1] 结果=blah[:,b,t]。取消查询-1 导致

>>>结果 张量[[2], [ 5], [ 8]], [[14], [17], [20]]]
以下是一种方法:

假设a是mxbxc形张量。以下是一些具有代表性的数值

>>>M=3 >>>B=5 >>>C=4 >>>a=火炬,m,B,C >>>a 张量[[0.6222,0.6703,0.0057,0.3210], [0.6251, 0.3286, 0.8451, 0.5978], [0.0808, 0.8408, 0.3795, 0.4872], [0.8589, 0.8891, 0.8033, 0.8906], [0.5620, 0.5275, 0.4272, 0.2286]], [[0.2419, 0.0179, 0.2052, 0.6859], [0.1868, 0.7766, 0.3648, 0.9697], [0.6750, 0.4715, 0.9377, 0.3220], [0.0537, 0.1719, 0.0013, 0.0537], [0.2681, 0.7514, 0.6523, 0.7703]], [[0.5285, 0.5360, 0.7949, 0.6210], [0.3066, 0.1138, 0.6412, 0.4724], [0.3599, 0.9624, 0.0266, 0.1455], [0.7474, 0.2999, 0.7476, 0.2889], [0.1779, 0.3515, 0.8900, 0.2301]]] 假设1D类张量是t,它给出了批处理中每个示例的真实类。所以它是一个B形的一维张量,类标签在{0,1,2,…,C-1}范围内

所以基本上你要从a的最内层维度中选择对应于t的索引。这可以通过以下方式实现:

>>> i = torch.arange(M).reshape(M, 1, 1)
>>> j = torch.arange(B).reshape(1, B, 1)
>>> k = t.reshape(1, B, 1)
请注意,一旦你用i,j,k索引任何东西,它们将变成M,B,1的形状,这是所需的输出形状。 现在只需通过i、j和k对a进行索引,即可得出:


因此,从本质上讲,如果您事先生成传递访问模式的索引数组,您可以直接使用它们来提取张量的某些片段。

您只需传递:

您的索引将作为第三个切片 rangeB作为第二个切片 i、 e.第二个dim中每个第三个dim索引对应的元素 等等 等等
>>> i = torch.arange(M).reshape(M, 1, 1)
>>> j = torch.arange(B).reshape(1, B, 1)
>>> k = t.reshape(1, B, 1)
>>> a[i, j, k]
tensor([[[0.3210],
         [0.8451],
         [0.8408],
         [0.8891],
         [0.5620]],

        [[0.6859],
         [0.3648],
         [0.4715],
         [0.1719],
         [0.2681]],

        [[0.6210],
         [0.6412],
         [0.9624],
         [0.2999],
         [0.1779]]])