Python np.searchsorted()背后是否有一个有趣的算法?
searchsorted()函数对于在numpy中组织数据非常有用,尤其适用于大型数组 为什么这么快?只是(类似于矢量化代码),我们可以让代码直接在“C”中运行。但是有没有可能我可以在numpy中获得类似的更基本的函数呢?我可以写(使用matlab的人称之为“矢量化代码”来执行searchsorted的操作吗?Spyder(IPython控制台)和line magics很有用Python np.searchsorted()背后是否有一个有趣的算法?,python,numpy,vectorization,Python,Numpy,Vectorization,searchsorted()函数对于在numpy中组织数据非常有用,尤其适用于大型数组 为什么这么快?只是(类似于矢量化代码),我们可以让代码直接在“C”中运行。但是有没有可能我可以在numpy中获得类似的更基本的函数呢?我可以写(使用matlab的人称之为“矢量化代码”来执行searchsorted的操作吗?Spyder(IPython控制台)和line magics很有用 np.searchsorted?? Signature: np.searchsorted(a, v, side='lef
np.searchsorted??
Signature: np.searchsorted(a, v, side='left', sorter=None)
Source:
@array_function_dispatch(_searchsorted_dispatcher)
def searchsorted(a, v, side='left', sorter=None):
"""
Find indices where elements should be inserted to maintain order.
... huge snip
This function uses the same algorithm as the builtin python `bisect.bisect_left`
(``side='left'``) and `bisect.bisect_right` (``side='right'``) functions,
which is also vectorized in the `v` argument.
... ditto
"""
return _wrapfunc(a, 'searchsorted', v, side=side, sorter=sorter)
File: c:\...source path...\lib\site-packages\numpy\core\fromnumeric.py
Type: function
因此,如果需要实际的算法细节,搜索将在python端进行对分。该算法是基本的,tt使用二进制搜索,因此它可以以对数而不是线性扩展为代价预先排序数据。矢量化并没有在这方面发挥作用,尽管我想象代码是在C级别实现的。您可以使用
对分
模块实现类似的功能,或者编写自己的对分搜索算法(数百万CS入门学生最终必须这么做…)注意,矢量化通常只影响“常量因子”,即它在算法上并不比python级别的for循环更有效,它的速度明显更快,但它的伸缩性相同。也许我误解了这个问题,但是searchsorted
已经矢量化了。在result=a.searchsorted(target)
中,a
和target
都可以是数组,result
将具有与target
相同的形状。如果你需要一些不同的东西,你能描述一下你需要什么吗。@BiRico,我想我的问题已经得到了回答,但我想解释一下searchsorted函数中发生了什么,以及我是否可以在numpy/python中编写与它速度相当的代码。(这样我就可以理解解释其加速的算法)收集您的评论,numpy代码基本上应用了C中的二进制搜索方法,它解释了相对于“矢量化”代码的加速,该代码将(快速)搜索列表中的每个元素。