a = np.array([1, 2, 2, 3])
print(np.searchsorted(a, 0)) # 0
print(np.searchsorted(a, 1)) # 0
print(np.searchsorted(a, 2)) # 1
print(np.searchsorted(a, 2, 'left')) # 1
print(np.searchsorted(a, 2, 'right')) # 3
print(np.searchsorted(a, 2.5, 'right')) # 3
print(np.searchsorted(a, 2.5, 'left')) # 3
print(np.searchsorted(a, 3, 'left')) # 3
print(np.searchsorted(a, 3, 'right')) # 4
print(np.searchsorted(a, 4)) # 4
print(np.searchsorted(a, [0, 1, 2, 3, 4, 5, ])) # [0 0 1 3 4 4]

searchsorted有三个重要参数:

  • a:待查找的有序数组
  • v:待查找的值
  • side:字符串,取值为left或者right,表示取下界(闭区间)还是取上界(开区间),默认参数为下界闭区间

利用searchsorted可以非常炫酷地实现轮盘赌随机选取:

    t = np.cumsum(weights)
sample = np.searchsorted(t, np.random.random() * t[-1])

cumsum保证了递增,searchsorted二分查找,其中t[-1]表示全部元素之和,整个过程一气呵成、美不胜收。

虽然如此,这种方式依然不是最好的方法。因为numpy提供了轮盘赌算法。

from collections import Counter

import numpy as np

a = []
for i in range(10000):
x = np.random.choice([1, 2, 3], 2, p=[0.1, 0.3, 0.6])
a.extend(x)
a = Counter(a)
a = np.array([np.array(i) for i in a.items()], dtype=np.float32)
a[:, 1] /= np.sum(a[:, 1])
print(a)

输出为

[[1.      0.0993 ]
[2. 0.30325]
[3. 0.59745]]

因为searchsorted的下闭区间、上开区间效果有些奇特,所以可以wrap一下使它的行为更加明确

二分查找实际上可以写成四种:

  • 左闭区间
  • 右闭区间
  • 左开区间
  • 右开区间

如果自己写,一定要十分小心地考虑好边界条件才能够避免出错。

import numpy as np

def bisearch(a, v, can_eq=True, side='left'):
x = np.searchsorted(a, v, side=side)
if x >= a.shape[0]:
return x
if can_eq:
if side == 'left':
if a[x] == v:
return x
else:
return x - 1
else:
if a[x] > v:
if x > 0 and a[x - 1] == v:
return x - 1
else:
return x
else:
return x
else:
if side == 'left':
if a[x] == v:
return x - 1
else:
return x
else:
return x a = np.array([1, 2, 2, 4])
print(bisearch(a, 2, True, 'left'))#1
print(bisearch(a, 2, True, 'right'))#2
print(bisearch(a, 2, False, 'left'))#0
print(bisearch(a, 2, False, 'right'))#3
print(bisearch(a, -1, True, 'left'))#-1
print(bisearch(a, 5, True, 'right'))#4

numpy二分查找的更多相关文章

  1. bisect 二分查找

    先说明的是,使用这个模块的函数前先确保操作的列表是已排序的. 先看看 insort  函数: 其插入的结果是不会影响原有的排序. 再看看 bisect  函数: 其目的在于查找该数值将会插入的位置并返 ...

  2. python bisect 排序模块 二分查找与 bisect 模块

    python 3.6.5 import bisect bisect_list=dir(bisect)print(bisect_list)bisect_list = ['__builtins__', ' ...

  3. 二分查找与 bisect 模块

    Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index() 方法,其时间复杂度为O(n).对于大数据量,则可以用二分查找进行优化.二分查找 ...

  4. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  5. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  6. 从一个NOI题目再学习二分查找。

    二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...

  7. java实现二分查找

    /** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...

  8. 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布

    最新IP地址数据库  来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...

  9. c#-二分查找-算法

    折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...

随机推荐

  1. RxJava 操作符 on和doOn 线程切换 调度 Schedulers 线程池 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Eclipse添加tomcat服务器以及解决404的问题

    Eclipse JavaEE IDE添加tomcat服务器 1. 先做准备工作,首先下载工具 点击下方链接下载     1) Tomcat v7.0     2) Eclipse IDE for Ja ...

  3. java中两种发起POST请求,并接收返回的响应内容的方式  (转)

    http://xyz168000.blog.163.com/blog/static/21032308201162293625569/ 2.利用java自带的java.net.*包下提供的工具类 代码如 ...

  4. mysql的sql分页函数limit使用 (转)

    http://www.cnblogs.com/beijingstruggle/p/5631603.html mysql的sql分页函数limit使用 My sql数据库最简单,是利用mysql的LIM ...

  5. (纪录片)科学的故事:权力、证据与激情 The Story Of Science: Power, Proof And Passion

    简介: 导演: 纳特·沙曼编剧: 纳特·沙曼主演: Michael J. Mosley类型: 纪录片官方网站: www.bbc.co.uk/programmes/b00s9mms制片国家/地区: 英国 ...

  6. iOS社交app技术合伙人笔试题

    理想状况当然是找到有管理能力且还在写代码的架构师了,然而假设有这种人,他自己能发起项目了.你要拉上他还真难.满足一定条件就可以了,别追求完美. 还有比这更完美的吗?请生产这种机器人: 性格开朗(开朗≠ ...

  7. Android studio 自己定义打包APK名称

    Android Studio打包应用默认生成的apk名称是:app-release.apk .假设我们要让生成的apk名跟我们版本号包名有联系的话.那我们就要自己定义生成的apk名了,要怎么做呢. 我 ...

  8. 解决Android Studio提示gradle project sync failed报错的解决方法

    运行的时候报错,提示:gradle project sync failed 1.打开AS,切换到project目录结构依次进入目录app->gradle->gradle-wrapper.p ...

  9. MVC 之 缓存机制(二)

    八.应用程序缓存 应用程序缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中. 使用应用程序缓存与使用应用程序状态类似. 但是,与应用程序状态不同的是,应用程序缓存中的数据是易失的, 即数据 ...

  10. Hbase master启动报错:Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster Caused by: java.net.UnknownHostException:

    Hbase master启动报错: java.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop ...