Py学习  »  Python

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

rpb • 3 年前 • 1160 次点击  

给定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 .

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133309
 
1160 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Shubham Sharma
Reply   •   1 楼
Shubham Sharma    3 年前

这似乎是使用的理想问题 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