我已经有了一个运行良好的算法,但我希望以另一种方式实现它,以获得个人满足感。
简而言之:我有一些数组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[i+1]时,obj_idx中有更多的值。
最后,我将最后一个值附加到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]的混合数组
有没有比从混合数组中提取整数更简单的方法呢?
发布于 2021-10-08 23:50:03
你可以只使用列表理解中的'if‘子句,就像这里描述的if/else in a list comprehension一样,来过滤源迭代器。例如(我避免使用numpy来连接值,只是为了组成一行程序,但当然它不会改变任何事情):
base = [obj_idx[0]] + [
obj_idx[i+1] for i in range(1, len(obj_idx)-1) if (obj_idx[i+1] != obj_idx[i] + 1)
]
top = [
obj_idx[i] for i in range(1, len(obj_idx)-1) if (obj_idx[i+1] != obj_idx[i] + 1)
] + [obj_idx[-1]]https://stackoverflow.com/questions/69502481
复制相似问题