【问题标题】:Python 3: test for contiguous numbers in one linePython 3:在一行中测试连续数字
【发布时间】: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 中的下一个对象。如果是,则没有找到边,继续。

否则,我找到了优势,所以我追加到basetop。我可以推断在找到的边缘处既有顶部也有底部,因为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


    【解决方案1】:

    您可以只使用列表推导中的“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]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2011-10-14
      • 2019-06-24
      相关资源
      最近更新 更多