为什么 torch 转置 return 一个不连续的张量,而等效的视图操作 return 是一个连续的张量?

Why does torch transpose return a non-contiguous tensor but the equivalent view operation returns a contiguous one?

torch.Tensor.view()torch.tensor.transpose()都可以转置二维张量,例如

a = torch.arange(8).reshape(2, 4)
a.t().is_contiguous() # False
a.view(4,2).is_contiguous() # True

但是用 .view() 交换维度会产生一个连续的张量,而使用 .t() 会产生一个不连续的张量。很明显,在保持连续性的同时进行转置是有可能的,虽然我不太明白如何,但我的主要问题是:为什么这两个函数的行为不同?

view 的文档说“返回的张量共享相同的数据”,transpose 的文档说“生成的 out 张量与 input张量”所以我天真地期望输出的连续状态对于两个函数是相同的,但也许“共享相同的数据”和“共享底层存储”是两个不同的东西?

编辑:我没想到有一种方法可以将这个张量重塑为 4,2,即 not 转置 lol。感谢已接受答案的作者指出 a.t() != a.view(dim1, dim0).

使用 view(4, 2) 你不是在转置张量,你只是在重塑它。

原始张量:

t = torch.tensor([[1, 2],
                  [3, 4],
                  [5, 6],
                  [7, 8]])

t.transpose() returns:

torch.tensor([[1, 3, 5, 7],
              [2, 4, 6, 8]])

t.view(4, 2) returns:

t.tensor([[1, 2, 3, 4],
          [5, 6, 7, 8]])