np.argsort() 未找到实现

np.argsort() implementation is not found

我想看看 numpy.argsort() 是如何工作的。

  1. 在文档中,numpy.argsort() 的来源在 numpy.core.fromnumeric.py。没关系。 https://numpy.org/doc/stable/reference/generated/numpy.argsort.html

  2. core.fromnumeric.argsort()稍微复杂一点。
    不考虑装饰器,fromnumeric.argsort(arr)returns_wrapfunc(arr, "argsort")然后returnsarr.argsort()。没问题。
    假设 arrnumpy.ndarray,它可能在 array_api.__init__.pyhttps://github.com/numpy/numpy/blob/v1.21.0/numpy/core/fromnumeric.py

  3. array_api.argsort() 来自 array_api._sorting_functions.argsort()。好的。https://github.com/numpy/numpy/blob/main/numpy/array_api/__init__.py

  4. _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.fromnumeric https://github.com/numpy/numpy/blob/main/numpy/__init__.pyi

    1.5.是一回事。

是循环引用吗?虽然我知道那行得通。 2.中的it might be in array_api.__init__.py.错了吗?那么,该实现的实际位置在哪里?


P.S.

我认为 np.uniquereturn_index=True 时很慢。我想 np.unique 排序数组,但我发现 np.unique 调用 np.argsort。然后,我尝试区分 np.argsortnp.sort 之间的区别,因此我需要 np.argsort.
的详细信息 一开始我不得不这么说。

为什么要看源码?要在您自己的 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] link。这导致了同样的事情。

通知:

@array_function_dispatch(_argsort_dispatcher)

最新版本已添加此 dispatch 层;查看发行说明以获取更多详细信息。根据我的经验,这只会让搜索代码变得更加困难。

另一个步骤是转到 github 并进行搜索。有时这会产生一些有用的信息,但通常是徒劳的。

作为用户,我不需要知道“如何”的细节。阅读文档很容易,如果我还有疑问,可以做一些实验。深入研究 c 代码无助于更好地使用它。

关于你补充的问题:

所有 ndarray 对象都是“多数组”,维度从 0 到 32。

github

numpy github 我搜索了 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);

这似乎是在 numpy/core/src/multiarray/item_selection.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);

等等....

None 帮助我更好地使用它。