如何高效找到重叠区间?

2024-01-30

我有以下玩具示例数据框,df:

      f_low    f_high
   0.476201  0.481915
   0.479161  0.484977
   0.485997  0.491911
   0.503259  0.508679
   0.504687  0.510075
   0.504687  0.670075
   0.666093  0.670438
   0.765602  0.770028
   0.766884  0.771307
   0.775986  0.780398
   0.794590  0.798965

为了找到它的重叠子集,我使用以下代码:

df = df.sort_values('f_low')
for row in df.itertuples():
    iix = pd.IntervalIndex.from_arrays(df.f_low, df.f_high, closed='neither')
    span_range = pd.Interval(row.f_low, row.f_high)
    fx = df[(iix.overlaps(span_range))].copy()

我想获得这样的重叠数据框:

   # iteration 1: over row.f_low=0.476201  row.f_high=0.481915 

      f_low    f_high
   0.476201  0.481915
   0.479161  0.484977

   # iteration 2: over row.f_low=0.503259  row.f_high=0.508679 
      f_low    f_high
   0.503259  0.508679 
   0.504687  0.510075
   0.504687 0.670075

   # iteration 3: over row.f_low=0.504687  row.f_high=0.670075 
      f_low    f_high
   0.666093  0.670438

etc.

这很有效,但由于数据帧非常大并且有很多重叠,因此需要很长时间来处理。另外,我正在测试重叠的间隔在使用时不会抓住自己Interval and overlaps熊猫的方法。

这意味着一系列重叠的置信区间与迭代的每一行。

除了迭代所有元组之外,是否有一种方法可以更有效地提取给定间隔的重叠间隔?

这是未排序的实际数据帧块:

f_low   f_high
0.504687  0.670075
0.476201  0.481915
0.765602  0.770028
0.479161  0.484977
0.766884  0.771307
0.485997  0.491911
0.666093  0.670438
0.503259  0.508679
0.775986  0.780398
0.504687  0.510075
0.794590  0.798965

连续重叠

Treat "f_low"值作为入口点并分配​​一个值1。对待"f_high"值作为退出点并分配一个值-1。如果我们按升序处理所有值并累积分配的值,那么当累积值大于零时,我们将有一个重叠间隔。如果累计值达到零,我们就知道我们已经退出了任何重叠间隔。

NOTE:

这会将所有连续重叠的间隔分组。如果某个间隔与第一个间隔不重叠BUT与链中的最后一个重叠,则算作重叠。

我将为该解决方案下面的其他选项提供类似的解决方案。


尝试的例子

#  1     3                     (Interval from 1 to 3)
#     2        5               (Interval from 2 to 5)
#                    7     9   (Interval from 7 to 9)

#  1  1 -1    -1     1    -1   (Entry/Exit values)
#  1  2  1     0     1     0   (Accumulated values)
#              ⇑           ⇑
# zero indicates leaving all overlaps

这表明一旦进入区间,我们就开始1 to 3,我们不会保留所有重叠的间隔,直到我们到达5区间的右侧2 to 5如累计值达到零所示。


我将使用生成器返回具有重叠间隔的原始数据帧的索引列表。

归根结底,这应该是N * Log(N)对于涉及的排序。

def gen_overlaps(df):
    df = df.sort_values('f_low')
    
    # get sorter lows and highs
    a = df.to_numpy().ravel().argsort()
    
    # get free un-sorter
    b = np.empty_like(a)
    b[a] = np.arange(len(a))
    
    # get ones and negative ones
    # to indicate entering into
    # and exiting an interval
    c = np.ones(df.shape, int) * [1, -1]
    
    # if we sort by all values and
    # accumulate when we enter and exit
    # the accumulated value should be 
    # zero when there are no overlaps
    d = c.ravel()[a].cumsum()[b].reshape(df.shape)
    #             ⇑           ⇑
    # sort by value order     unsort to get back to original order
    
    indices = []
    for i, indicator in zip(df.index, d[:, 1] == 0):
        indices.append(i)
        if indicator:
            yield indices
            indices = []
    if indices:
        yield indices
    

然后我会用pd.concat组织它们来表达我的意思。k is the kth团体。有些组只有一个间隔。

pd.concat({
    k: df.loc[i] for k, i in
    enumerate(gen_overlaps(df))
})

         f_low    f_high
0 0   0.476201  0.481915
  1   0.479161  0.484977
1 2   0.485997  0.491911
2 3   0.503259  0.508679
  4   0.504687  0.510075
  5   0.504687  0.670075
  6   0.666093  0.670438
3 7   0.765602  0.770028
  8   0.766884  0.771307
4 9   0.775986  0.780398
5 10  0.794590  0.798965

如果我们只想要重叠的......

pd.concat({
    k: df.loc[i] for k, i in
    enumerate(gen_overlaps(df))
    if len(i) > 1
})

        f_low    f_high
0 0  0.476201  0.481915
  1  0.479161  0.484977
2 3  0.503259  0.508679
  4  0.504687  0.510075
  5  0.504687  0.670075
  6  0.666093  0.670438
3 7  0.765602  0.770028
  8  0.766884  0.771307

仅与队列中的下一个间隔重叠

这是一个更简单的解决方案,并且符合 OP 所需的输出。

def gen_overlaps(df):
    df = df.sort_values('f_low')
        
    indices = []
    cursor = None
    for i, low, high in df.itertuples():
        if not indices:
            cursor = high
        if low <= cursor:
            indices.append(i)
        else:
            yield indices
            indices = []
            cursor = high
    if len(indices) > 1:
        yield indices
    

pd.concat({
    k: df.loc[i] for k, i in
    enumerate(gen_overlaps(df))
})

        f_low    f_high
0 0  0.476201  0.481915
  1  0.479161  0.484977
1 3  0.503259  0.508679
  4  0.504687  0.510075
  5  0.504687  0.670075
2 7  0.765602  0.770028
  8  0.766884  0.771307
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何高效找到重叠区间? 的相关文章

随机推荐

  • Python message.content 不和谐机器人

    我正在努力让我的discord py当有人发送一些单词时 机器人会自动响应 但问题是该命令仅在该单词是句子中首先写入的情况下才有效 我希望我的机器人能够响应该消息 即使该单词位于某个句子的中间 如果这是可能的 我该怎么做 以下示例将执行您想
  • iOS 支持哪些字体格式?

    我想知道iOS支持哪些字体格式 我已经知道iOS支持TTF格式 它是否支持任何其他功能 例如 PFM 或 PMB 从 iOS 7 开始 支持 TTF 和 OTF 字体格式 您可以在应用程序中或通过配置文件分发这些字体 以使它们在系统范围内可
  • 如何将 boost::bind 与不可复制的参数一起使用,例如 boost::promise?

    某些 C 对象没有复制构造函数 但有移动构造函数 例如 boost promise 如何使用它们的移动构造函数绑定这些对象 include
  • 大地图寻路

    我正在创建一个带有 10 000 x 10 000 地图的游戏 我希望用户能够设置位置并让计算机立即找到最佳路径 然而 由于地图是10 000 x 10 000 有100 000 000个节点 并且通过诸如A 或Dijkstra之类的传统方
  • SQL GROUP_CONCAT 拆分为不同的列

    我进行了很多搜索 但没有找到解决我的问题的正确方法 我想做什么 我在 MySQL 中有 2 个表 国家 货币 我通过 CountryCurrency 将它们加入到一起 gt 由于多对多的关系 请参阅此示例 http sqlfiddle co
  • 将 cython cdef 扩展数组设置为零

    有没有一种 cython ic 方式来设置cdef数组归零 我有一个具有以下签名的函数 cdef cget values double cpc x double cpc y 该函数的调用方式如下 cdef double cpc x 16 c
  • 当鼠标实际移动到元素上时如何获取 MouseMove 事件

    基本上我想要做的是将自定义窗口的状态从最大化更改为正常状态 并调整窗口的位置 当用户单击标题栏并将鼠标移动到标题栏上时 在我的情况下 标题栏是一个简单的边框 显而易见的事情是将事件处理程序附加到MouseMove并检查鼠标左键是否被按下 p
  • 带有嵌套对象数组的胡子模板

    需要一点帮助来弄清楚为什么我的 Mustache 模板无法正确呈现 我很困惑为什么以下不起作用 我确信这是我的一个小错误或者其他什么 var tableRows name name1 values 1 2 3 name name2 valu
  • Python - 自动检测电子邮件内容编码

    我正在编写一个脚本来处理电子邮件 并且我可以访问电子邮件的原始字符串内容 我目前正在寻找字符串 Content Transfer Encoding 并扫描紧随其后的字符 以确定编码 编码示例 base64 或 7bit 或引用打印 有没有更
  • 在 Play Framework 2.0 上运行演化

    最近的这篇文章 如何在 Play Framework 2 0 中使用 Evolutions https stackoverflow com questions 8164157 how to use evolutions in play fr
  • 从我的网页访问 Flask 服务器

    这是一个问题 从这个问题继续here https stackoverflow com questions 22088719 can flask use with jquery post 我正在尝试使用网页上的图像按钮来控制伺服电机 我的伺服
  • 使用完整单词作为登录系统的变量[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在创建一个登录系统 当前使用硬编码整数作为用户 ID 密码和学生号 这意味着它们都是数字 我将使用什么来使整数 用户 ID 和密码 成为
  • PSQLException:当前事务被中止,命令被忽略直到事务块结束

    我在 JBoss 7 1 1 Final 的 server log 文件中看到以下 截断的 堆栈跟踪 Caused by org postgresql util PSQLException ERROR current transaction
  • 如何从其他节点js文件调用该函数

    这些代码存储在单独的文件中 我尝试从该文件调用 get 方法到另一个nodejs 但我只得到 Function 作为输出 谁能告诉我如何从这个文件调用另一个节点js文件的get方法 use strict var createAPIReque
  • 如何清除 MySQL 控制台中的屏幕? [复制]

    这个问题在这里已经有答案了 我无法清除 MySQL 命令行提示符中的屏幕 我的屏幕上充满了表格 数据和查询 我怎样才能清除它 Ctrl L 会做的 这是一个 shell 命令 但它在 MySQL 控制台中运行良好
  • 带 DatePicker 的 AlertDialog

    我的想法是使用 AlertDialog 并将其设置为 DatePicker 我的代码是 AlertDialog Builder builder new AlertDialog Builder this DatePicker picker n
  • PLCrashReporter - 如何符号化进程中的崩溃数据?

    在我们获得崩溃数据后 有没有办法对崩溃报告进行符号化 目前 这就是我在handleCrashReport方法中所做的事情 PLCrashReportTextFormat textFormat PLCrashReportTextFormati
  • Android 在 Google 地图中进行捏合缩放

    谷歌地图中的捏缩放功能是否可行 我进行了多次搜索但没有得到任何解决方案 请给出您的看法 或者需要编写api来实现这些功能 您是否使用 ScaleGestureDetector 来实现捏合和缩放 http developer android
  • 我的 Android 设备上的多个编码器支持 Mime 类型视频/avc

    当我枚举设备上的所有媒体编解码器时 我注意到以下编码器支持 mime 类型 video avc OMX qcom video encoder avc OMX google h264 encoder 你打电话时MediaCodec Creat
  • 如何高效找到重叠区间?

    我有以下玩具示例数据框 df f low f high 0 476201 0 481915 0 479161 0 484977 0 485997 0 491911 0 503259 0 508679 0 504687 0 510075 0