首页 > 解决方案 > a[:,:,0] 和 a[:][:][0] 之间的差异

问题描述

嗨,我正在研究 python 中的切片,我发现了一些奇怪的东西,我不明白

import torch

a = torch.tensor([
    [
        [1, 2, 3],
        [4, 5, 6]
    ],
    [
        [7, 2, 3],
        [8, 5, 6]
    ]
])
>>> a[:][:][0]
tensor([[1, 2, 3],
        [4, 5, 6]])

>>> a[:,:,0]
tensor([[1, 4],
        [7, 8]])

我试图从对应的火炬列表中拉出[[1,4,7,8]],所以我输入了一个[:][:][0],结果是[[1,2,3], [4,5,6]]。
然后,当我输入 a[:,:,0] 时,出现了 [[1,4,7,8]]。
我以为他们没有什么不同,但出现了不同的结果。
torch 和 numpy 运算符,有一个类似 a[:,0] 的操作。它与 a[:][0] 究竟有何不同?

标签: pythonnumpypytorch

解决方案


您可以看到第一个 ,a[:][:][0]是几个对 的链式调用__getitem__。这意味着a[:][:][0]大致相当于:

b = a[:]
c = b[:]
d = c[0]

结果在哪里da[0]在您的情况下,它返回与, 因为相同的东西a[:] == a

相反,a[:,:,0]只会用参数调用__getitem__ 一次slice(None), slice(None), 0

在您的情况下,这是第三轴上张量的第一片。


推荐阅读