python bisect 二分算法工具以及应用

python bisect 工具以及应用
主要用于在顺序固定的序列中查找以及插入

内置了四种方法

  • bisect_left
  • bisect_right
  • insort_right
  • insort_left

bisect_left/right 方法找到应该插入元素的位置,对于和序列中元素不相同的值,两个方法返回的一样,对于相同的值,left返回相同值的位置,right返回相同值下一个位置
例如在ps = [1, 3, 5, 9, 9, 100]
query = 9
的话,left返回3,right返回5

import bisect
import pandas as pd
import numpy as np
from functools import reduce
from typing import Listimport tensorflow as tf
import torch
from sklearn.preprocessing import KBinsDiscretizer# Bisection algorithms. 源码阅读
def insort_right(a, x, lo=0, hi=None, *, key=None):"""Insert item x in list a, and keep it sorted assuming a is sorted.If x is already in a, insert it to the right of the rightmost x.Optional args lo (default 0) and hi (default len(a)) bound theslice of a to be searched.A custom key function can be supplied to customize the sort order."""if key is None:lo = bisect_right(a, x, lo, hi)else:lo = bisect_right(a, key(x), lo, hi, key=key)a.insert(lo, x)def insort_left(a, x, lo=0, hi=None, *, key=None):"""Insert item x in list a, and keep it sorted assuming a is sorted.If x is already in a, insert it to the left of the leftmost x.Optional args lo (default 0) and hi (default len(a)) bound theslice of a to be searched.A custom key function can be supplied to customize the sort order."""if key is None:lo = bisect_left(a, x, lo, hi)else:lo = bisect_left(a, key(x), lo, hi, key=key)a.insert(lo, x)def bisect_right(a, x, lo=0, hi=None, *, key=None):"""Return the index where to insert item x in list a, assuming a is sorted.The return value i is such that all e in a[:i] have e <= x, and all e ina[i:] have e > x.  So if x already appears in the list, a.insert(i, x) willinsert just after the rightmost x already there.Optional args lo (default 0) and hi (default len(a)) bound theslice of a to be searched.A custom key function can be supplied to customize the sort order."""if lo < 0:raise ValueError('lo must be non-negative')if hi is None:hi = len(a)# Note, the comparison uses "<" to match the# __lt__() logic in list.sort() and in heapq.if key is None:while lo < hi:mid = (lo + hi) // 2if x < a[mid]:hi = midelse:lo = mid + 1else:while lo < hi:mid = (lo + hi) // 2if x < key(a[mid]):hi = midelse:lo = mid + 1return lodef bisect_left(a, x, lo=0, hi=None, *, key=None):"""Return the index where to insert item x in list a, assuming a is sorted。The return value i is such that all e in a[:i] have e < x, and all e ina[i:] have e >= x.  So if x already appears in the list, a.insert(i, x) willinsert just before the leftmost x already there.Optional args lo (default 0) and hi (default len(a)) bound theslice of a to be searched.A custom key function can be supplied to customize the sort order."""if lo < 0:raise ValueError('lo must be non-negative')if hi is None:hi = len(a)# Note, the comparison uses "<" to match the# __lt__() logic in list.sort() and in heapq.if key is None:while lo < hi:mid = (lo + hi) // 2if a[mid] < x:lo = mid + 1else:hi = midelse:while lo < hi:mid = (lo + hi) // 2if key(a[mid]) < x:lo = mid + 1else:hi = midreturn lo# Application
# 二分查找函数
ps = [1, 3, 5, 9, 100]
T = 66
print(bisect.bisect_left(ps, T, lo=0, hi=len(ps)))  # 二分左边界
print(bisect.bisect_right(ps, T, lo=0, hi=len(ps)))  # 二分右边界
print(bisect.bisect_left(ps, 9, lo=0, hi=len(ps)))  # 二分左边界
print(bisect.bisect_right(ps, 9, lo=0, hi=len(ps)))  # 二分右边界
bisect.insort_left(ps, T, lo=0, hi=len(ps))  # 二分插入到左侧
bisect.insort_right(ps, T, lo=0, hi=len(ps))  # 二分插入到右侧# 当时自我实现的,找到右边第一个比target的大的值的位置
def find_next_greater_o(arr, target):"""相当于bisect_right"""low, high = 0, len(arr) - 1try:if target < arr[low]:return -1except Exception as e:return -1while low <= high:mid = low + (high - low) // 2if arr[mid] <= target:low = mid + 1else:if arr[mid - 1] <= target:return midhigh = mid - 1return -1# 利用bisect实现
def find_next_greater(arr, target):try:i = bisect_right(arr, target, lo=0, hi=len(arr))if i == len(arr):return -1return iexcept Exception as e:print(f"Error [{e}] happened when finding the [{target}], return default")return -1def find_gt(a, x):# Find leftmost value greater thani = bisect_right(a, x)if i != len(a):return ireturn -1arr = [3, 4, 6, 7]
target = 5# print(find_next_greater(arr, target))
# print(find_gt(arr, target))
# print(find_next_greater(arr, 'fd'))
# print(find_next_greater(arr, 999))
# print(find_gt(arr, 999))# def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
#     i = bisect(breakpoints, score)
#     return grades[i]
#
# a = [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
# ['F', 'A', 'C', 'C', 'B', 'A', 'A']

应用:数据分箱

# 数据分箱
def p_cut(bins: List[int], val: int, grades=None) -> int:"""return the result of discretization input val;左闭右开;:param bins: bins for describe:param val: value to set:param grades: customize the output"""if grades is not None:assert len(bins) == len(grades)grades = gradeselse:grades = reduce(lambda x, y: str(x) + str(y),[i for i in range(len(bins) + 1)])# try if for cover typeerrortry:i = bisect_right(bins, val)return int(grades[i])except TypeError as e:print(f"TypeError: {e} for input {val}")return -1print("*" * 10 + "Discretization test" + "*" * 10)
print(p_cut([1, 10, 20, 50, 100], val=5))
print(p_cut([1, 10, 20, 50, 100], val=1))
print(p_cut([1, 10, 20, 50, 100], val=10))
print(p_cut([1, 10, 20, 50, 100], val=500))
print(p_cut([1, 10, 20, 50, 100], val=""))bins = [1, 10, 20, 50, 100]
test_arr = [-100, None, 1, 5, 30, 500]
test_arr1 = [-100, 1, 5, 30, 500]
print([p_cut(bins, v) for v in test_arr])# 同样的功能利用pandas cut实现
# pandas cut 不支持val是其他类型,会直接报typeerror;
# pandas cut 对于不在区间内的值做NaN处理
print(pd.cut(test_arr1, bins=bins, labels=['a', 'b', 'c', 'd']))# 在大数据情况下,pandas cut可能不够高效,同样的功能还可以使用sklearn实现
data = np.array(test_arr1).reshape(-1, 1)  # 重塑数据为2D,因为 Scikit-Learn 需要2D数组
est = KBinsDiscretizer(n_bins=4, encode='ordinal', strategy='quantile')
est.fit(data)
bins_sk = est.bin_edges_[0]  # 获取边界
print(bins_sk)# tensorflow实现
## tf.keras.layers.Discretization
## tf.keras.layers.Discretization 左闭右开
"""在tf1 中是使用 tf.feature_column.bucketized_column
但是在tf2 中官方推荐的是tf.keras.layers.Discretization
"""
discretization_layer = tf.keras.layers.Discretization(bin_boundaries=bins)
print(f"tf.keras output:{discretization_layer(test_arr1)}")## tf.searchsorted or torch.searchsorted(bins, values, right=True) 左开右闭
print(tf.reshape(tf.searchsorted(bins, test_arr1), (-1, len(test_arr1))))bins_tensor = torch.tensor(bins, dtype=torch.float32)
values = torch.tensor(test_arr1, dtype=torch.float32)
indices = torch.searchsorted(bins_tensor, values, right=False)# 对比
print("*" * 10)
print(f"self code output:{[p_cut(bins, v) for v in test_arr1]}")
print(f"pd.cut output: {pd.cut(test_arr1, bins=bins)}")
print(f"tf.keras output:{discretization_layer(test_arr1)}")
print(f"torch.searchsorted output:{indices}")
print(f"tf.searchsorted output :{tf.searchsorted(bins, test_arr1)}")
print("*" * 10 + "Discretization test finished" + "*" * 10) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python数据处理(pandas)

# 新的数据格式&#xff0c;csv纯文本&#xff0c;使用某个字符集&#xff0c;比如都是ASCII、Unicode、EBCDIC或GB2312&#xff08;简体中文环境&#xff09;等&#xff1b;由记录组成&#xff08;典型的是每行一条记录&#xff09;每条记录被分隔符&#xff08;英语&#xff…

ffmpeg 7.0 + vs2022 +windows编译

后面有总结&#xff1a; 安装msys2 打开 &#xff08;这一步非常重要不然就得指定vs的环境&#xff09; x64 Native Tools Command Prompt for VS 2022运行 在x64 Native Tools Command Prompt for VS 2022命令行中切换到msys2安装目录中 打开 msys2_shell.cmd运行 安装 pa…

GNU/Linux - 如何使用lsmod和modinfo命令

How to Use the lsmod and modinfo Commands in Linux Linux 内核是模块化的&#xff0c;这意味着可以根据需要添加和删除模块。这就造就了一个轻量级、安全和轻便的内核。它的灵活性让你可以添加和删除你需要的功能&#xff0c;使操作系统符合你的使用情况和偏好。 The Linux …

企业大文件传输之安全数据传输的重要性

企业数据安全性的维护直接关系到企业的市场竞争力乃至其生存的根基。数据的保护不仅涉及到保护企业的商业秘密&#xff0c;也关乎到客户隐私的保护&#xff0c;更触及到国家安全的敏感层面。因此&#xff0c;保障数据在传输过程中的安全&#xff0c;成为了每个企业和组织必须面…

Linux中的fork与进程地址空间

目录 前言 一、进程地址空间 二、fork的值返回 三、高清图链接 总结 前言 在博主的《进程状态解析》一文中&#xff0c;在讨论进程创建时&#xff0c;提到了一个系统调用接口fork&#xff0c;它在使用过程中表现出对于父子进程不一致的返回结果&#xff0c;而且似乎还具有…

python笔记(17)输入输出

一、标准输入与输出简介 Python通过内置的sys模块管理标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;stdout&#xff09;和标准错误&#xff08;stderr&#xff09;。但对大多数简单应用而言&#xff0c;直接使用内置函数就足够了。 二、输入&#xff1a;inpu…

ETL工具kettle(PDI)入门教程,Transform,Mysql->Mysql,Csv->Excel

什么是kettle&#xff0c;kettle的下载&#xff0c;安装和配置&#xff1a;ETL免费工具kettle(PDI)&#xff0c;安装和配置-CSDN博客 mysql安装配置&#xff1a;Linux Centos8 Mysql8.3.0安装_linux安装mysql8.3-CSDN博客 1 mysql -> mysql 1.1 mysql CREATE TABLE user_…

618值得入手的平价好物清单,看完再买不吃亏!

即将到来的618年中购物狂欢节&#xff0c;无疑是一年一度的购物盛宴。为了让大家的购物体验更加愉悦和充实&#xff0c;我特地为大家精选了一系列好物。如果你也打算在618尽情购物&#xff0c;那就赶紧收藏这份清单吧&#xff01; 一、舒适佩戴不伤耳——南卡骨传导耳机Runner…

C补充1—1章1.0—C程序语言设计(许宝文,李志)

二手书到了&#xff0c;好消息&#xff0c;前主人看的很认真&#xff0c;坏消息&#xff0c;只看到这页了 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊最后几题好难啊啊啊啊啊&#xff0c;再议 目录 1.1 入门 1.2 变量与算数表达式 练习1-3 //打印温度对照表 练习1-4 //摄氏-华氏温…

微软VC++基础插件集合最新版

随着C语言的不断演进&#xff0c;微软不断更新其Visual C&#xff08;简称VC&#xff09;工具集&#xff0c;以支持最新的C标准和开发实践。2024年&#xff0c;微软发布了VC基础插件集合的最新版&#xff0c;为C开发者带来了一系列新功能和改进。以下是关于这个最新版插件集合的…

医疗行业如何提升Windows操作系统登录的安全性

医疗行业使用账号和密码登录Windows系统时&#xff0c;可能会遇到一些痛点&#xff0c;这些痛点可能会影响工作效率、数据安全和用户体验。以下是一些主要的痛点&#xff1a; 1. 密码管理复杂性&#xff1a;医疗行业通常涉及大量的敏感数据和隐私信息&#xff0c;因此密码策略…

为什么 Cloudflare 是 2024 年 Vercel 的最佳替代品?生态系统和价格比较

本文探讨了 Vercel 的功能&#xff0c;并与 Cloudflare 生态系统中的类似产品进行了比较。从托管到存储&#xff0c;我们将看到为什么 Cloudflare 可以在 2024 年成为 Vercel 的最佳替代品。 文章目录 介绍什么是 Cloudflare&#xff1f;Cloudflare vs Vercel&#xff1a;托管和…

实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

BS架构 数据权限--字段级权限 设计与实现

一、需求场景 1. 销售发货场景 销售出库单上 有 商品名称、发货数量、单价、总金额 等信息。 销售人员 关注 上述所有信息&#xff0c;但 仓管人员 不需要知道 单价、总金额 信息。 2. 配方、工艺保密 场景 配方研发人员 掌握核心配方&#xff0c; 但 交给车间打样、生产时…

深入探索Dockerfile:构建容器化应用的秘密武器

想象一下&#xff0c;您正在开发一款创新的Web应用&#xff0c;您希望能够简化部署流程、确保环境一致性&#xff0c;并且提高开发团队的效率。在这个过程中&#xff0c;Dockerfile 可能是您最强大的工具之一。Dockerfile 是一个简单而又强大的文本文件&#xff0c;它包含了构建…

锚索测力计在岩土工程中的应用

随着现代工程建设的快速发展&#xff0c;岩土工程安全问题日益受到人们的关注。岩土工程中的锚索结构&#xff0c;作为保证工程稳定和安全的关键部分&#xff0c;其性能监测和评估显得尤为重要。近年来&#xff0c;锚索测力计作为一种先进的监测工具&#xff0c;在岩土工程安全…

微信小程序跳转微信管理平台配置的客服及意见页面

<button open-type"contact" bindcontact"handleContact" session-from"sessionFrom">帮助与客服</button> 不需要路径 在当前小程序中会自动进入 open-type"contact" 其他参数不用修改 只修改这个参数对应表单组件 /…

【千帆平台】使用AppBuilder零代码创建应用,然后通过OpenAPI方式调用应用

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建API密钥调用文档调用说明API服务域名通信协议字符编码公…

Spring AOP浅谈

什么是AOP&#xff1f; AOP是Aspect-Oriented Programming的缩写&#xff0c;是一种面向切面的编程方法。 在AOP中&#xff0c;一个切面是一组可以独立于其他代码执行的功能&#xff0c;如日志记录、安全性检查、事务处理等。这些功能通常被称为"通知"&#xff0c;并…

C++发票识别API 、发票录入

“十二金”工程是我国政府在信息化建设中的重要一步&#xff0c;“金税工程”总称为中国税收管理信息系统&#xff08;CTAIS&#xff09;&#xff0c;是我国电子政务的核心系统之一,是财政的重要环节。十二金”是面向政府办公业务建立的十二个重点信息应用系统&#xff0c;按“…