如何正确访问3D-Pytorch-Tensor中的元素?

时间:2019-05-04 11:30:46

标签: python-3.x vectorization pytorch tensor tensor-indexing

我正在尝试访问3D-Pytorch-Tensor中的多个元素,但是返回的元素数是错误的。

这是我的代码:

import torch

a = torch.FloatTensor(4,3,2)
print("a = {}".format(a))
print("a[:][:][0] = {}".format(a[:][:][0]))

这是输出:

a = tensor([[[-4.8569e+36,  3.0760e-41],
         [ 2.7953e+20,  1.6928e+22],
         [ 3.1692e-40,  7.2945e-15]],

        [[ 2.5011e+24,  1.3173e-39],
         [ 1.7229e-07,  4.1262e-08],
         [ 4.1490e-08,  6.4103e-10]],

        [[ 3.1728e-40,  5.8258e-40],
         [ 2.8776e+32,  6.7805e-10],
         [ 3.1764e-40,  5.4229e+08]],

        [[ 7.2424e-37,  1.3697e+07],
         [-2.0362e-33,  1.8146e+11],
         [ 3.1836e-40,  1.9670e+34]]])
a[:][:][0] = tensor([[-4.8569e+36,  3.0760e-41],
        [ 2.7953e+20,  1.6928e+22],
        [ 3.1692e-40,  7.2945e-15]])

我期望这样的事情:

a[:][:][0] = tensor([[-4.8569e+36,  2.7953e+20, 3.1692e-40, 
          2.5011e+24, 1.7229e-07, 4.1490e-08, 
          3.1728e-40, 2.8776e+32, 3.1764e-40, 
          7.2424e-37, -2.0362e-33, 3.1836e-40]])

有人可以向我解释我如何得出这个结果吗? 提前非常感谢您!

我在执行时完全得到了预期的结果:

for i in range(4):
   for j in range(3):
      print("a[{}][{}][0] = {}".format(i,j, a[i][j][0]))

2 个答案:

答案 0 :(得分:0)

简短回答,您需要使用a[:, :, 0]

更多说明: 当您执行a[:]时,它会自己返回a。因此,a[:][:][0]与执行a[0]的过程相同,后者将为您提供第一个轴的第0个位置的元素(因此大小为(3,2))。您需要的是从最后一个轴的第0个位置开始执行的元素,a[:, :, 0]

答案 1 :(得分:0)

以下是对要查找的元素建立索引的一些解释和正确方法:

# input tensor to work with
In [11]: a = torch.arange(4*3*2).reshape(4,3,2)

# check its shape
In [12]: a.shape
Out[12]: torch.Size([4, 3, 2])

# inspect/annotate the tensor
In [13]: a
Out[13]:            # (    4      ,  3    ,    2      ) <= shape
tensor([[[ 0,  1],    | # block-0 | row-0 | col-0 col-1
         [ 2,  3],    | # block-0 | row-1 | col-0 col-1
         [ 4,  5]],   | # block-0 | row-2 | col-0 col-1

        [[ 6,  7],    | # block-1 | row-0 | col-0 col-1
         [ 8,  9],    | # block-1 | row-1 | col-0 col-1
         [10, 11]],   | # block-1 | row-2 | col-0 col-1

        [[12, 13],    | # block-2 | row-0 | col-0 col-1
         [14, 15],    | # block-2 | row-1 | col-0 col-1
         [16, 17]],   | # block-2 | row-2 | col-0 col-1

        [[18, 19],    | # block-3 | row-0 | col-0 col-1
         [20, 21],    | # block-3 | row-1 | col-0 col-1
         [22, 23]]])  | # block-3 | row-2 | col-0 col-1


# slice out what we need; (in all blocks, all rows, column-0)
In [14]: a[:, :, 0]
Out[14]: 
tensor([[ 0,  2,  4],
        [ 6,  8, 10],
        [12, 14, 16],
        [18, 20, 22]])

说明/澄清

张量的形状为[4, 3, 2],其中4代表个块(块0,...块3)的数量。接下来,我们有3代表每个块中的数量。最后,我们有2代表每行中的列数。我们使用切片符号a[:, :, 0]对其进行切片。

要访问 block ,我们只需要一个索引(即a [0],... a [3])。要访问特定 block 中的特定 row ,我们需要两个索引(即a [0,1],... a [3,2]) 。要从特定的 block 访问特定的 row 的特定,我们需要三个索引(即a [0,1, 1]等)


我推测您的案件由于使用torch.FloatTensor()而引起混乱。使用torch.FloatTensor()的问题在于,它将分配垃圾值或使用这些内存块的先前程序留下的值。有时这可能令人困惑,因为在后续运行之间我们可能会得到不一致的结果。