给出1D array

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

另一个1D array用于构建边界.

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,104,184,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.我想知道是否有有效的方法可以通过NumpyPandas的内置功能来实现这一点.

推荐答案

这似乎是使用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

Python相关问答推荐

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

基本链合同的地址是如何计算的?

Python无法在已导入的目录中看到新模块

从管道将Python应用程序部署到Azure Web应用程序,不包括需求包

具有症状的分段函数:如何仅针对某些输入值定义函数?

需要计算60,000个坐标之间的距离

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

按列分区,按另一列排序

使可滚动框架在tkinter环境中看起来自然

Pandas DataFrame中行之间的差异

如何指定列数据类型

需要帮助重新调整python fill_between与数据点

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

为什么\b在这个正则表达式中不解释为反斜杠

剪切间隔以添加特定日期

导入错误:无法导入名称';操作';

如何将一组组合框重置回无 Select tkinter?

浏览超过10k页获取数据,解析:欧洲搜索服务:从欧盟站点收集机会的微小刮刀&

如何根据一定条件生成段id

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子