我正在尝试访问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]))
答案 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()
的问题在于,它将分配垃圾值或使用这些内存块的先前程序留下的值。有时这可能令人困惑,因为在后续运行之间我们可能会得到不一致的结果。