numpy 找不到np.argsort()实作

relj7zay  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(161)

我想看看numpy.argsort()是如何工作的。
1.在文档中,numpy.argsort()的源代码是numpy.core.fromnumeric.py。这是可以理解的。https://numpy.org/doc/stable/reference/generated/numpy.argsort.html

  1. core.fromnumeric.argsort()要复杂一点。
    忽略装饰器,如果fromnumeric.argsort(arr)返回_wrapfunc(arr, "argsort"),则返回arr.argsort()。这不是问题。
    假设arrnumpy.ndarray,它可能在array_api.__init__.py中。
    1.是从这里来的
  2. _sorting_functions.argsort()调用numpy.argsort()这就是我一开始要找的,它是循环的https://github.com/numpy/numpy/blob/main/numpy/array_api/_sorting_functions.py
    额外的
    1.在numpy.__init__.pyi中,numpy.argsort()来自core.fromnumerichttps://github.com/numpy/numpy/blob/main/numpy/init.pyi
    1.5.是相同的。
    这些是循环引用吗?我当然知道这些工作。2.中的it might be in array_api.__init__.py.是错误的吗?那么它的实现的实际位置在哪里?

此问题的背景

我注意到np.unique在运行return_index=True的时候比较慢。我想在排序后的数组上运行np.unique,但是发现np.unique调用了np.argsort。所以我试图找出np.argsortnp.sort之间的区别,并且需要了解更多关于np.argsort的信息。

juud5qan

juud5qan1#

你为什么想看源代码?在你自己的c代码项目中实现它?我不认为它会帮助你在python中更有效地使用它。在一个Ipython会话中,我使用??

In [22]: np.argsort??
...
return _wrapfunc(a, 'argsort', axis=axis, kind=kind, order=order)

好的,这是一个函数把责任推给方法的典型情况。如果需要的话,函数版本会把输入转换成数组,然后调用数组的方法。通常函数版本有更完整的文档,但是功能基本上是一样的。

In [21]: arr.argsort??
Type:      builtin_function_or_method

通常这就是故事的结尾。
另一种方法是点击文档上的[source]链接。
注意事项:

@array_function_dispatch(_argsort_dispatcher)

最近的版本增加了这个dispatch层;查看发布说明以了解更多细节。根据我的经验,这只会使搜索代码变得更加困难。
另一个步骤是进入github进行搜索,有时会发现一些有用的信息,但通常是徒劳的。
作为一个用户,我不需要知道“如何”的细节。阅读文档很容易,如果我还有问题的话,做一些实验。深入研究c代码不会帮助我们更好地使用它。
至于你补充的问题:
所有的ndarray对象都是“多数组”的,具有从0到32维的任何维。

github程式码

numpygithub上,我搜索了argsort,并选择了最有希望的文件numpy/core/src/multiarray/methods. c
这有功能

array_argsort(PyArrayObject *self,
        PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames)

跳过似乎处理输入参数的代码,它看起来工作是在

res = PyArray_ArgSort(self, axis, sortkind);

它似乎在编号/核心/源代码/多阵列/项目选择. c中定义

PyArray_ArgSort(PyArrayObject *op, int axis, NPY_SORTKIND which)
 ...
 if (argsort == NULL) {
    if (PyArray_DESCR(op)->f->compare) {
        switch (which) {
            default:
            case NPY_QUICKSORT:
                argsort = npy_aquicksort;
                break;
            case NPY_HEAPSORT:
                argsort = npy_aheapsort;
                break;
            case NPY_STABLESORT:
                argsort = npy_atimsort;
                break;
   ...
   ret = _new_argsortlike(op2, axis, argsort, NULL, NULL, 0);

等等....
这些都没有帮助我更好地使用它。

相关问题