rearrange(mat, '(h n) w -> (n h) w', n = 2)
and
rearrange(mat, '(n h) w -> (h n) w', n = 2)
是彼此的倒置。如果你能想象一个做什么,第二个做反向变换
至于后者,mat是8x4
rearrange(mat, '(n h) w -> (h n) w', n = 4)
所以你首先将第一个维度拆分为 4x2 (下面我忽略 w 维度,因为它没有什么特别的事情发生)
[0, 1, 2, 3, 4, 5, 6, 7]
到
[0, 1,
2, 3,
4, 5,
6, 7]
然后将轴的顺序更改为 2x4(转置)
[0, 2, 4, 6,
1, 3, 5, 7]
然后将两个维度合并为一个
[0, 2, 4, 5, 1, 3, 5, 7]
如果您仍然不觉得它是如何工作的,请举一些更简单的例子,例如
rearrange(np.arange(50), '(h n) -> h n', h=5)
rearrange(np.arange(50), '(h n) -> h n', h=10)
rearrange(np.arange(50), '(h n) -> n h', h=10)
等等,这样您就可以跟踪矩阵中每个元素的移动