代码之家  ›  专栏  ›  技术社区  ›  mpx

在Python中查找整数可以与Numpy或Pandas一起驻留的最近边界值对

  •  2
  • mpx  · 技术社区  · 2 年前

    给定1D array

    a=np.array([ 65, 251, 431])
    

    还有一个1D 大堆 用于构建边界。

    b=np.array([  4,  10,  18,  22,  28,  33,  40,  49,  72,  83,  90,  93,  99,
                  107, 113, 119, 130, 142, 161, 167, 173, 178, 183, 196, 202, 209,
                  215, 221, 228, 233, 240, 258, 262, 269, 274, 281, 286, 297, 311,
                  317, 352, 354, 358, 365, 371, 376, 382, 389, 396, 413, 420, 441,
                  443, 450, 459, 467, 473, 477, 483, 491, 495, 497])
    

    例如,两点边界可以是坐标边界 4,10 , 4,18 , 4,497 ,..., 495,497 .

    目标是找到一个整数(例如数组a中的每个整数)可以驻留的最接近的边值对。

    比如价值 65 ,它可以驻留的最近边界是 49,72 .

    下面的代码应该符合这个目标

    import numpy as np
    import pandas as pd
    a=np.array([ 65, 251, 431])
    
    # Assumed `b` is sorted from lowest to highest value and no duplicate values
    b=np.array([  4,  10,  18,  22,  28,  33,  40,  49,  72,  83,  90,  93,  99,
                  107, 113, 119, 130, 142, 161, 167, 173, 178, 183, 196, 202, 209,
                  215, 221, 228, 233, 240, 258, 262, 269, 274, 281, 286, 297, 311,
                  317, 352, 354, 358, 365, 371, 376, 382, 389, 396, 413, 420, 441,
                  443, 450, 459, 467, 473, 477, 483, 491, 495, 497])
    
    
    leadB =b[:-1]
    trailB=b[1:]
    
    all_val=[]
    for dis_a in a:
        for l,t in zip(leadB,trailB):
            if l < dis_a <= t:
                all_val.append({'a':dis_a,'lb':l,'tb':t})
    
    # The final output can be in the form of pandas or numpy array
    df=pd.DataFrame(all_val)
    

    但是,上述方法在很大程度上依赖于两个阶段 for-loop .我想知道是否有有效的方法可以通过内置的 Numpy Pandas .

    1 回复  |  直到 2 年前
        1
  •  1
  •   Shubham Sharma mkln    2 年前

    这似乎是使用的理想问题 np.searchsorted 但是,根据您的实际需求,有两种可能的解决方案:

    • 如果所有元素 a 保证落在边界点之间:
    i = np.searchsorted(b, a)
    df = pd.DataFrame({'a': a, 'lb': b[i - 1], 'tb': b[i]})
    
    • 如果 A. 如果不属于边界点,则更一般的解决方案是:
    i = np.searchsorted(b, a)
    m = ~np.isin(i, [0, len(b)])
    
    df = pd.DataFrame({'a': a})
    df.loc[m, 'lb'], df.loc[m, 'tb'] = b[i[m] - 1], b[i[m]]
    

    后果

         a   lb   tb
    0   65   49   72
    1  251  240  258
    2  431  420  441