尝试使用广播和乘法:
image * image_mask[..., None]
我假设 image_mask 的类型是 bool,映射到数字 0 和 1。因此 image 和 mask 的成对相乘会将 masked 值设置为零。
使用 np.where() 或 and 运算符可以实现类似的效果。
问题是 image 和 image_mask 的形状不兼容。 Numpy 将首先在形状的头部添加额外的维度,直到两个张量具有相同的形状。因此 image_mask 从 (188, 212) 重塑为 (1,188, 212)。这个新形状与图像的形状不兼容
(188、212、3)。
诀窍是使用花式索引来重塑 image_mask。您可以使用 None 作为索引在形状末尾添加大小为 1 的虚拟尺寸。操作 image_mask[..., None] 会将其从 (188, 212) 重塑为 (188, 212,1)。
广播规则告诉我们,通过沿广播维度重复所有值来扩展大小为 1 的维度。因此 numoy 会自动将张量从 (188, 212,1) 重塑为 (188, 212,3)。由于不创建副本,因此操作速度非常快。
现在可以将位张量相乘以产生所需的结果。