合并和交叉排序的numpy数组。
sortednp的Python项目详细描述
numpy和numpy数组是一个非常好的工具。但是,相交和 合并多个排序的numpy数组的性能要差得多。当前的数字 实现将两个数组连接起来并对组合进行排序。如果你 想要合并或交叉多个numpy数组,有一种更快的方法, 通过使用属性,对结果数组进行排序。
sortednp(sorted numpy)对已排序的numpy数组进行操作,以计算 两个numpy数组的交集或并集。这个 结果数组还是一个已排序的numpy数组,可以合并或 与下一个数组相交。预期的用例是已排序的numpy 数组按基本数据结构排序,并合并或相交于 请求。典型的应用包括信息检索和搜索引擎 尤其是。
也可以实现K向合并或相交算法,
它同时操作任意数量的数组。这个包裹
用于处理具有$10^6
$或$10^{10}
$项的数组。通常,这些
数组太大,无法将其中两个以上的数组同时保存在内存中
时间。这个包实现了合并和交叉多个数组的方法,
可按需加载。
安装
有两种不同的安装方法sortednp
使用pip
(推荐)
您可以使用pip
(这里是pip3
)直接从pypi安装包。有
预编译的控制盘用于Linux
32位和64位。
$ pip3 install sortednp
使用设置工具
或者,您可以克隆git存储库并运行 设置脚本。
$ git clone https://gitlab.sauerburger.com/frank/sortednp.git
$ cd sortednp
$ python3 setup.py install
numpy依赖性
安装在某些情况下会失败,因为构建时依赖于
麻木的通常,可以通过手动安装最近的numpy来解决这个问题。
版本通过pip3 install-u numpy
用法
这个包提供了两种不同的方法。头等舱 在两个阵列上操作。第二类操作两个或多个数组,并且 在内部调用第一类方法。
双向方法
两个numpy排序的数组可以用merge
方法合并,该方法需要两个
numpy数组并返回两个数组的排序并集。
# merge.pyimportnumpyasnpimportsortednpassnpa=np.array([0,3,4,6,7])b=np.array([1,2,3,5,7,9])m=snp.merge(a,b)print(m)
如果运行此命令,则应将两个数组的并集看作一个排序的numpy 数组,
$python3merge.py[01233456779]
两个已排序的numpy数组可以与intersect
方法相交,该方法需要两个
numpy数组并返回两个数组的排序交集。
# intersect.pyimportnumpyasnpimportsortednpassnpa=np.array([0,3,4,6,7])b=np.array([1,2,3,5,7,9])i=snp.intersect(a,b)print(i)
如果运行此命令,则应将两个数组的交集视为已排序的numpy 数组,
$python3intersect.py[37]
返回数组索引
intersect
方法接受一个可选参数索引
它是false
默认情况下。如果设置为true
,则返回值由
交叉数组和一个二者都有公共值索引的元组
数组,
# intersect_indices.pyimportnumpyasnpimportsortednpassnpa=np.array([2,4,6,8,10])b=np.array([1,2,3,4])intersection,indices=snp.intersect(a,b,indices=True)print(intersection)print(indices)
以上示例给出:
$python3intersect_indices.py[24](array([0,1]),array([1,3]))
第一行显示两个数组的交集。第二行
打印包含索引的元组,其中公共值出现在输入中
数组。例如,值4
位于数组a
中的位置1
和位置
3
在数组中b
K-路方法
类似地,k-way intersect和merge方法采用两个或多个数组 对其参数执行合并或相交操作。
# kway_intersect.pyimportnumpyasnpimportsortednpassnpa=np.array([0,3,4,6,7])b=np.array([0,3,5,7,9])c=np.array([1,2,3,5,7,9])d=np.array([2,3,6,7,8])i=snp.kway_intersect(a,b,c,d)print(i)
如果运行此命令,则应将所有四个数组的交集视为已排序的numpy 数组,
$ pip3 install sortednp0
k-way合并sortednp.kway_merge
的工作原理类似。然而,本地人
numpy
实现比这个包提供的合并更快。
为了完整起见,增加了k-way合并。Ppackageheapq
提供
同时合并多个数组的有效方法。
方法kway_merge
和kway_intersect
接受可选关键字
参数假定已排序。默认情况下,它设置为
true
。如果设置为false
,
在执行操作之前,该方法对输入数组调用sort()
。
如果数组已经排序以节省时间,则应保留默认值
对数组进行排序。
因为数组可能太大,无法将它们全部保存在内存中
时间,可以将可调用的
而不是数组传递给方法。
可调用的应该返回实际数组。它被立即调用
在需要数组之前。这样可以减少内存消耗。
算法
通过迭代两个数组来计算交点。对于中的给定元素
一个数组,方法需要搜索另一个数组并检查元素是否
包含的。为了提高效率,我们可以使用
数组被排序。有三种搜索方法,可以通过
可选关键字参数算法
sortednp.simple_search
:通过在 按元素排列元素。 更多信息sortednp.binary_search
:将数组的其余部分切成两半,然后 在包含搜索元素的切片上重复该过程。 更多信息sortednp.gallowing_search
:首先,线性搜索元素,加倍 每一步后的步长。如果步骤超出了搜索元素, 在最后两个位置之间执行二进制搜索。 更多信息
默认为sortednp.galloping_search
。三个人的表现
算法将在下一节中进行比较。
性能
包的性能可以与默认实现进行比较 numpy的intersect1d方法。sortednp和numpy之间的执行时间比率是 用于各种不同的基准测试。
在两种不同的假设下,可以估计合并或相交时间。如果 合并或相交的数组已经排序,不应该 考虑一下对基准中的随机数组进行排序所需的时间。上 另一方面,如果考虑数组未排序的情况,则 应考虑到分拣时间。
相交
交叉口操作的性能取决于 两个数组。例如,如果其中一个数组的第一个元素较大 与其他数组中的所有元素相比,只需搜索另一个数组 (线性、二元或指数)。同样,如果公共元素是 在数组中相隔甚远(稀疏性),可以跳过数组的大块。 基准中的数组包含随机(唯一)整数。稀疏是 定义为一个数组中两个连续元素之间的平均差。
第一组测试研究性能对 数组。第二组测试研究了对 数组,
假设已排序数组
下表总结了忽略时与numpy相比的性能 对初始数组排序所需的时间。
<表>包括排序时间
下表总结了与numpy相比的性能 对初始数组进行排序所需的时间。
<表>合并
<表>标签:
推荐PyPI第三方库
- 热门话题
- java如何在表被注释到配置之前获取表的元数据? java滚动条不会出现在JList上 java JOGL监视器GPU内存 java为什么要使用RecyclerView onDraw延迟 java定制Oppo Reno 2 Z CPH1951(手机型号)的固件(闪存文件) java自定义线程池执行器 java如何解决发布版本中重复的jar条目[com/安卓/volley/R.class]? java如何使用Bukkit API触发事件? java在blazemeter jmeter RTE插件中使用ctrl+w输入 C#/Visual Studio的java JDT等价物 java为什么当maxread值很大而收到的消息数量很小时,卡夫卡消费者会无限期消费? java游戏2。x:包含模板列表的绑定模型 带压缩的java日志旋转 运行时。exec用java运行程序读取它正在做什么