【问题标题】:np.argsort() implementation is not found未找到 np.argsort() 实现
【发布时间】:2021-12-13 06:55:55
【问题描述】:

我想看看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__.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__.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. 错了吗?那么,该实现的实际位置在哪里?


附言

return_index=True 时,我认为np.unique 很慢。我想np.unique 获得排序数组,但我发现np.unique 调用np.argsort。然后,我尝试将np.argsortnp.sort 区别开来,以便我需要np.argsort 的详细信息。
一开始我不得不这么说。

【问题讨论】:

  • 您在寻找array_argsort 还是PyArray_ArgSort
  • @Brian 非常感谢!这可能就是我想要的。我可以再问两个问题吗?
    1. 单轴阵列也是多阵列吗? 2.numpy.argsort与那些C代码有什么关系?(这是关于NumPy基础的问题,超出了原问题的范围)

标签: python numpy numpy-ndarray numpy-ufunc


【解决方案1】:

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

这似乎是在 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);

等等....

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

【讨论】:

  • ?? 跟踪非常有帮助。我很高兴知道您认为这些附加层难以搜索代码。这似乎很复杂,对了解实施没有帮助。非常感谢。
猜你喜欢
  • 2022-11-13
  • 1970-01-01
  • 2016-04-01
  • 2018-09-30
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多