首页 > 解决方案 > 未找到 np.argsort() 实现

问题描述

我想看看是如何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)返回_wrapfunc(arr, "argsort")然后返回arr.argsort()。没问题。
    假设arrnumpy.ndarray,它可能在array_api.__init__.py. https://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__.pyinumpy.argsort()来自core.fromnumeric https://github.com/numpy/numpy/blob/main/numpy/__init__.pyi

    1.并且5.是一回事。

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


附言

我以为np.unique是慢的时候return_index=True。我想要np.unique一个排序数组,但我找到了np.unique调用np.argsortnp.argsort然后,我尝试在from之间进行区分,np.sort以便我需要np.argsort.
一开始我不得不这么说。

标签: pythonnumpynumpy-ndarraynumpy-ufunc

解决方案


为什么要查看源代码?在自己的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

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);

等等 ....

这些都不能帮助我更好地使用它。


推荐阅读