如何在 numpy 3D 矩阵中沿 z 轴打乱特定的 2D 单元?

问题描述 投票:0回答:1

假设我有一个 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 矩阵。

但是,这显然很笨拙。有没有更干净的方法来做到这一点?

numpy matrix shuffle
1个回答
0
投票

随机播放没有“轴”参数。否则,你可以尝试类似

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
的另一种方式。

© www.soinside.com 2019 - 2024. All rights reserved.