假设我有一个维度为(1, 1, 6, 6)的分段图a

print(a)
array([[[[ 0.,  0.,  0.,  0.,  0.,  0.],
         [ 0., 15., 15., 16., 16.,  0.],
         [ 0., 15., 15., 16., 16.,  0.],
         [ 0., 13., 13.,  9.,  9.,  0.],
         [ 0., 13., 13.,  9.,  9.,  0.],
         [ 0.,  0.,  0.,  0.,  0.,  0.]]]], dtype=float32)

如何在不使用for循环的情况下获得每个类的二进制掩码?二进制掩码的维度应该是(4, 1, 6, 6),目前我正在做这样的事情,我想要它没有for循环的原因是a的维度可能会改变,可能会有更多/更少的类.谢谢.

a1 = np.where(a == 15, 1, 0)
a2 = np.where(a == 16, 1, 0)
a3 = np.where(a == 13, 1, 0)
a4 = np.where(a == 9, 1, 0)
b = np.concatenate((a1, a2, a3, a4), axis=0)

print(b)
array([[[[0, 0, 0, 0, 0, 0],
         [0, 1, 1, 0, 0, 0],
         [0, 1, 1, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0]]],


       [[[0, 0, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0]]],


       [[[0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 1, 1, 0, 0, 0],
         [0, 1, 1, 0, 0, 0],
         [0, 0, 0, 0, 0, 0]]],


       [[[0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 0, 0, 0]]]])

推荐答案

使用numpy.unique和广播:

u = np.unique(a)
# array([ 0.,  9., 13., 15., 16.], dtype=float32)

out = (a == u[np.nonzero(u)][:,None,None,None]).astype(int)

输出:

array([[[[0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 0, 0, 0]]],


       [[[0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 1, 1, 0, 0, 0],
         [0, 1, 1, 0, 0, 0],
         [0, 0, 0, 0, 0, 0]]],


       [[[0, 0, 0, 0, 0, 0],
         [0, 1, 1, 0, 0, 0],
         [0, 1, 1, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0]]],


       [[[0, 0, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0]]]])

Python相关问答推荐

如何将新的SQL服务器功能映射到SQL Alchemy的ORM

使用matplotlib pcolormesh,如何停止从一行绘制的磁贴连接到上下行?

跟踪我已从数组中 Select 的样本的最有效方法

分组数据并删除重复数据

如何根据参数推断对象的返回类型?

如何列举Pandigital Prime Set

Python键入协议默认值

如何在Python数据框架中加速序列的符号化

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

在np数组上实现无重叠的二维滑动窗口

Python+线程\TrocessPoolExecutor

根据列值添加时区

当我try 在django中更新模型时,模型表单数据不可见

python中的解释会在后台调用函数吗?

需要帮助重新调整python fill_between与数据点

在matplotlib中删除子图之间的间隙_mosaic

为什么常规操作不以其就地对应操作为基础?

重置PD帧中的值

使用Openpyxl从Excel中的折线图更改图表样式

如何在Great Table中处理inf和nans