我有一个 numpy 数组ys_big_seg
,其形状如下:(146, 128, 128)。它包含像素掩码,其值可以是0或1。如果像素属于给定类别,则为 1,否则为 0。我必须将其缩放为二进制掩码。所以我想迭代 (128, 128) 矩阵并将其拆分为 (8, 8) 矩阵,然后基于较小的矩阵值(如果每个元素都是 0 那么 0,如果每个元素都是 1 那么 1,如果有是混合值,然后随机为 0 或 1)用给定值替换这些较小的矩阵,将 (128, 128) 矩阵简化为 (16, 16)。
如何解决这个问题? 我希望这是有道理的,对不起我的英语。
最佳答案
我认为这符合您的要求:
>>> x.shape
(146, 128, 128)
>>> mask = x.reshape(-1, 16, 16, 8, 8).sum(axis=(3, 4)) >= 32
>>> mask.shape
(146, 16, 16)
如果总和 >= 32(即一半或更多值是 1),任何混合有 0 和 1 的 8x8 block 都会得到 1,所以它不完全是 1 > 随机选择。
显然,总和为 0(8x8 block 中的所有元素均为 0)将“失败”该标准并为 0,总和为 64(8x8 block 中的所有元素均为 1)将“通过”并结束设为 1。如果您的矩阵更加稀疏,您可以将阈值从 32
降低。
由于您使用此数组作为掩码,因此您可以将 1 和 0 保留为其 bool 对应项。但如果您打算将掩码用作二进制数组,那么您可以轻松添加 .astype(int)
。
关于python - 将矩阵分割成更小的 block 并根据其值执行某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72764515/