gpt4 book ai didi

python - 为覆盖所有二维矩阵的三个非重叠掩码生成

转载 作者:太空宇宙 更新时间:2023-11-04 00:11:37 24 4
gpt4 key购买 nike

我有一个二维数组,我想通过掩码生成将它分成 3 个不重叠的随机子矩阵。例如我有一个矩阵如下:

input = [[1,2,3],
[4,5,6],
[7,8,9]]

我想要三个随机的 0-1 掩码,如下所示:

mask1 = [[0,1,0],
[1,0,1],
[0,0,0]]
mask2 = [[1,0,0],
[0,1,0],
[1,0,0]]
mask3 =[[0,0,1],
[0,0,0],
[0,1,1]]

但是我的输入矩阵太大了,我需要快速处理。我还想确定每个掩码的比例作为输入。在上面的示例中,所有掩码的比率都相等。为了生成一个随机掩码,我使用以下代码:

np.random.choice([0, 1],size=(size of matrix[0],size of matrix[1]))

我的问题是如何生成不重叠的蒙版。

最佳答案

IIUC,可以做一个0、1、2的随机矩阵,然后提取m == 0、m == 1、m == 2的值:

groups = np.random.randint(0, 3, (5,5))
masks = (groups[...,None] == np.arange(3)[None,:]).T

但是,这并不能保证每个掩码中的元素数量相等。为此,您可以排列平衡分配:

a = np.arange(25).reshape(5,5)  # dummy input
groups = np.random.permutation(np.arange(a.size) % 3).reshape(a.shape)
masks = (groups[...,None] == np.arange(3)[None,:]).T

如果你想要一个随机概率在一个组中:

groups = np.random.choice([0,1,2], p=[0.3, 0.6, 0.1], size=a.shape)

什么的。您需要做的就是决定如何将单元格分配给 groups,然后您就可以构建掩码了。

例如:

In [431]: groups = np.random.permutation(np.arange(a.size) % 3).reshape(a.shape)

In [432]: groups
Out[432]:
array([[1, 0, 0, 2, 0],
[1, 2, 0, 0, 1],
[2, 0, 2, 0, 2],
[1, 1, 2, 1, 0],
[2, 2, 1, 1, 0]], dtype=int32)

In [433]: masks = (groups[...,None] == np.arange(3)[None,:]).T

In [434]: masks
Out[434]:
array([[[False, False, False, False, False],
[ True, False, True, False, False],
[ True, True, False, False, False],
[False, True, True, False, False],
[ True, False, False, True, True]],

[[ True, True, False, True, False],
[False, False, False, True, False],
[False, False, False, False, True],
[False, False, False, True, True],
[False, True, False, False, False]],

[[False, False, True, False, True],
[False, True, False, False, True],
[False, False, True, True, False],
[ True, False, False, False, False],
[False, False, True, False, False]]])

这给了我一个完整的面具:

In [450]: masks.sum(axis=0)
Out[450]:
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])

并且合理平衡。如果单元格的数量是 3 的倍数,则这些数字都一致。

In [451]: masks.sum(2).sum(1)
Out[451]: array([9, 8, 8])

如果您愿意,可以使用 .astype(int) 将 bool 数组转换为 0 和 1 的 int 数组。

关于python - 为覆盖所有二维矩阵的三个非重叠掩码生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52356615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com