假设我有一个 3D numpy 矩阵
M
,形状为 (c, b, a)
。我想沿着 z 轴对 (x, y)
中的特定单元格 M
进行洗牌——也就是说,我想对数组 [M[z][y][x] for z in range(c)]
进行洗牌并将其分配回来(不知何故,我不知道这是如何工作的 - -- 也许与 M[:, y, x]
?)
我可以想到一种方法来做到这一点:展平每个 2D 矩阵,因此
M1
是一个 2D 矩阵;将 M1
转置为 M2
,打乱 M2[x+y*a]
,将 M2
转置回 M1
,然后重新构建 2D 矩阵。
但是,这显然很笨拙。有没有更干净的方法来做到这一点?
随机播放没有“轴”参数。否则,你可以尝试类似
np.random.shuffle(M, axis=(1,2))
的东西。
但是,幸运的是,shuffle 仍然只能在特定的轴上工作。即轴0。
所以我会把我想要洗牌的所有东西放在轴 0 上。然后洗牌。然后再次整形
M=np.arange(60).reshape(5, 4, 3) # Just an example
view=M.transpose(1,2,0).reshape(-1, len(M)) # A view of M, with axis 0 being a whole 4x3 plane, and axis 1 being size 5
np.random.shuffle(view)
M
正如你所看到的,它对每个平面进行了洗牌(
M[0,:,:]
仍然包含前12个数字0..11,M[1,:,:]
,接下来的12个,从12到23等。但是这些数字是随机顺序的。除非我误解了你的问题,否则这就是你想要的。
所有这一切,都无需复制任何数据(当然
shuffle
本身除外),因为 view
只是查看 M
的另一种方式。