tom*_*m c 1 python numpy reshape pytorch tensor
对于张量:
x = torch.tensor([
[
[[0.4495, 0.2356],
[0.4069, 0.2361],
[0.4224, 0.2362]],
[[0.4357, 0.6762],
[0.4370, 0.6779],
[0.4406, 0.6663]]
],
[
[[0.5796, 0.4047],
[0.5655, 0.4080],
[0.5431, 0.4035]],
[[0.5338, 0.6255],
[0.5335, 0.6266],
[0.5204, 0.6396]]
]
])
Run Code Online (Sandbox Code Playgroud)
首先想将其分成 2 个 (x.shape[0]) 张量,然后将它们连接起来。在这里,只要获得正确的输出,我实际上并不需要将其拆分,但在视觉上将其拆分然后将它们连接在一起对我来说更有意义。
例如:
# the shape of the splits are always the same
split1 = torch.tensor([
[[0.4495, 0.2356],
[0.4069, 0.2361],
[0.4224, 0.2362]],
[[0.4357, 0.6762],
[0.4370, 0.6779],
[0.4406, 0.6663]]
])
split2 = torch.tensor([
[[0.5796, 0.4047],
[0.5655, 0.4080],
[0.5431, 0.4035]],
[[0.5338, 0.6255],
[0.5335, 0.6266],
[0.5204, 0.6396]]
])
split1 = torch.cat((split1[0], split1[1]), dim=1)
split2 = torch.cat((split2[0], split2[1]), dim=1)
what_i_want = torch.cat((split1, split2), dim=0).reshape(x.shape[0], split1.shape[0], split1.shape[1])
Run Code Online (Sandbox Code Playgroud)
对于上面的结果,我认为直接重塑 x.reshape([2, 3, 4]) 会起作用,它会产生正确的尺寸但结果不正确。
一般来说我是:
谢谢
python、pytorch、numpy、c++ 等中内存中元素的顺序是行优先顺序:
[ first, second
third, forth ]
Run Code Online (Sandbox Code Playgroud)
而在 matlab、fortran 等中,顺序是列主:
[ first, third
second, fourth ]
Run Code Online (Sandbox Code Playgroud)
对于更高维度的张量,这意味着元素从最后一个维度到第一个维度排序。
您可以使用torch.arange以下命令轻松地将其可视化.view:
[ first, second
third, forth ]
Run Code Online (Sandbox Code Playgroud)
结果与
Run Code Online (Sandbox Code Playgroud)tensor([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
正如您所看到的,元素首先按行(最后一个维度)排序,然后按列排序,最后按第一个维度排序。
当您reshape使用张量时,您不会更改元素的基本顺序,而只会更改shape张量的顺序。然而,如果你是permute一个张量 - 你会改变元素的基本顺序。
看看a.view(3,2,4)和之间的区别a.permute(0,1,2)-shape生成的两个张量是相同的,但元素的顺序不同:
[ first, third
second, fourth ]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6423 次 |
| 最近记录: |