如何shuffle一个3维的矩阵tensor

比如我有个a

a = ones(2, 2, 3);
a[:, :, 1] = [1 1; 1 1];
a[:, :, 2] = [2 2; 2 2];
a[:, :, 3] = [3 3; 3 3]

得到的a长这样

2×2×3 Array{Float64,3}:
[:, :, 1] =
 1.0  1.0
 1.0  1.0

[:, :, 2] =
 2.0  2.0
 2.0  2.0

[:, :, 3] =
 3.0  3.0
 3.0  3.0

我想随机shuffle这个tensor,比如变得的结果是这样的:

[:, :, 1] =
 3.0  3.0
 3.0  3.0

[:, :, 2] =
 1.0  1.0
 1.0  1.0

[:, :, 3] =
 2.0  2.0
 2.0  2.0

只改变第三个维度的顺序, 而不改变每个子矩阵的信息。我要怎么做?我试过用Random包的shuffle,但它会改变矩阵的内容。

a[:, :, randperm(size(a, 3))]

or,

a[:, :, shuffle(axes(a, 3))]

3 个赞

如果要 in-place的话,可以自己动手写个 2 层的 for 循环 shuffle 下,

1 个赞

我想到的第三种

a[:, :, shuffle(1: size(a, 3))]

速度上,randperm最快,接着axes,接着我的这个。应该跟randperm和shuffle的实现有关系