保持形状的图像分割类ID numpy数组元素检查修改高效实现方法
解决方案
直接用NumPy内置的向量化操作替代Python层循环即可,性能可以提升数百倍,完全满足实时场景要求,以下是两种适配你场景的实现:
方案1:通用np.isin实现(适合类ID范围不确定的场景)
np.isin会对输入数组做逐元素判断,返回布尔数组,你只需要对结果取反后转成整数类型即可得到目标掩码:
import numpy as np # 你的输入示例 class_ID_array = np.array([ [1,2,3], [4,5,6], [7,8,9] ]) blacklist = [2,4,5] # 核心逻辑,一行完成 desired_array = (~np.isin(class_ID_array, blacklist)).astype(int)
运行后输出和你期望的结果完全一致:
array([[1, 0, 1], [0, 0, 1], [1, 1, 1]])
该实现完全兼容你(13,16,1)shape的输入,输出维度和输入完全一致,无需额外调整。
方案2:查表法(最优性能,适配你类ID范围0~20的场景)
因为你的类ID取值范围极小(只有0~20共21个值),可以提前构造查表掩码,通过索引直接取值,性能比np.isin还要高30%以上:
import numpy as np class_ID_array = np.array([ [1,2,3], [4,5,6], [7,8,9] ]) blacklist = [2,4,5] # 提前构造掩码表,类ID最大为20所以长度设为21 mask_table = np.ones(21, dtype=np.uint8) mask_table[blacklist] = 0 # 直接索引查表,速度极快 desired_array = mask_table[class_ID_array]
如果你的黑名单是固定的,mask_table可以在程序初始化阶段只生成一次,后续每次推理只需要执行查表那一行即可,开销几乎可以忽略。
内容的提问来源于stack exchange,提问作者sarobando
相关产品推荐
相关产品推荐

