Python np.searchsorted()背后是否有一个有趣的算法?

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

searchsorted()函数对于在numpy中组织数据非常有用,尤其适用于大型数组

为什么这么快?只是(类似于矢量化代码),我们可以让代码直接在“C”中运行。但是有没有可能我可以在numpy中获得类似的更基本的函数呢?我可以写(使用matlab的人称之为“矢量化代码”来执行searchsorted的操作吗?

Spyder(IPython控制台)和line magics很有用

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中的二进制搜索方法,它解释了相对于“矢量化”代码的加速,该代码将(快速)搜索列表中的每个元素。