python - 在 Python 中使用 Numpy 或 Pandas 查找整数可以驻留的最接近的边界值对

标签 python pandas numpy performance

给定一个一维数组

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

和另一个用于构造边界的一维数组

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 - 在 Python 中使用 Numpy 或 Pandas 查找整数可以驻留的最接近的边界值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72066618/

相关文章:

python - Flask 没有解析 bootstrap glyphicons?

python - NANOPOOL API 到 Python 请求

python - 更有效/干净的方式来聚合数据

python - 将多个元素附加到 numpy 数组

python - 创建具有向量倍数的 numpy 矩阵的最快方法

python - 如何在Python中从串行数据包中提取字节序列并将其更改为正确的整数表示形式?

python - DataFrame Pandas - 使用索引和列名作为新列名展平数据框

python - Pandas 在 groupby 后为每组采样不同的分数

python - 为什么 lil_matrix 和 dok_matrix 与普通的字典相比这么慢?

python - 将数据帧行附加到其他数据帧的特定值 - python