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. centos7.2使用rpm安装jdk8

    ①下载jdk 去jdk下载页面找到要下载的jdk,用wget下载 wget --no-check-certificate --no-cookies --header "Cookie: ora ...

  2. python对json的操作总结 zz

    Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用于h ...

  3. (转载)Java8新的日期API LocalDate, LocalTime

    前言 由于Java Date的各种问题,Java8推出了新的日期API,很受一拨人的追捧. 为什么我们需要新的Java日期/时间API? 在开始研究Java 8日期/时间API之前,让我们先来看一下为 ...

  4. WPF装饰元素

    Border: <Style TargetType="Border"> <Setter Property="CornerRadius" Val ...

  5. Centos下配置单元测试工具gtest

    gtest是google提供的一个非常强大的单元测试工具,下载地址:https://code.google.com/p/googletest 我下载的是gtest-1.6.0.拷贝到Centos系统上 ...

  6. Flask调试

    1.AttributeError: 'NoneType' object has no attribute 'app' 原因:直接在py中调用视图函数,但没有上下文,导致出错 2.不转换html代码 { ...

  7. Port already be taken

    我运行同一个docker run命令两次后,第二次给出提示,说端口已经被占用. Port has already been allocated [解决方法] 运行docker container ls ...

  8. [Functional Programming] Arrow Functor with contramap

    What is Arrow Functor? Arrow is a Profunctor that lifts a function of type a -> b and allows for ...

  9. ASP入门(一)环境的搭建

    突然转战ASP是因为,手头要实现一个类似管理系统的东东,正好把ASP再从头学习一下下. ASP可以做什么? ASP,它的原文是 Active Server Pages . ASP最核心的扩展内容:Ac ...

  10. Android Studio:xxx is not an enclosing class 错误的解决方法

    Android Studio:xxx is not an enclosing class 错误的解决方法 这个问题一般出现在内部类中,若要创建内部类的实例,需要有外部类的实例才行,或者是将内部类设置为 ...