【发布时间】:2021-11-28 19:17:41
【问题描述】:
我有一个运行良好的算法,但我希望以另一种方式实现它以获得个人满意度。
简而言之:我有一些数组obj_level,它是一个布尔掩码,指示对象所在的坐标,所以类似于
obj_level = [ 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 , 1, 1 ]
我想识别对象的底部和顶部。
我首先通过生成一个包含对象非零索引的数组obj_idx 来做到这一点。如果数组不为空,则将第一个值附加到base。
然后我循环并测试索引的值 + 1 是否等于obj_idx 中的下一个对象。如果是,则没有找到边,继续。
否则,我找到了优势,所以我追加到base 和top。我可以推断在找到的边缘处既有顶部也有底部,因为obj_idx 中有更多值,因为我正在针对obj_idx[i+1] 进行测试。
最后,我将最后一个值附加到top,因为如果有底,对象必须有顶。
base = []
top = []
obj_idx = np.flatnonzero(obj_level)
if obj_idx.size > 0:
base . append(obj_idx[0])
for i,idx in enumerate(obj_idx[:-1]):
if idx+1 == obj_idx[i+1]:
continue
else:
top.append(idx)
base.append(obj_idx[i+1])
top.append(obj_idx[-1])
我想用更少的行来完成这项工作。类似:
base = [
idx + 1 == obj_idx[i+1] or idx+1
for i,idx in enumerate(obj_idx[:-1])
]
top = [
(idx+1 == obj_idx[i+1] or idx
for i,idx in enumerate(obj_idx[:-1])
]
np.insert(base,0,obj_idx[0])
np.insert(top,-1,obj_idx[-1])
但我最终得到了一个混合数组,例如 [True, True, 3, True, True]
有没有比从混合数组中提取整数更简单的方法?
【问题讨论】:
标签: python python-3.x boolean contiguous