【问题标题】:NumPy: Where in the source code are `arange` and `array` functions defined?NumPy:源代码中的“arange”和“array”函数在哪里定义?
【发布时间】:2018-05-08 13:14:03
【问题描述】:

我正在寻找 NumPy 中 arangearray 函数的源代码,但找不到:https://github.com/numpy/numpy/search?utf8=%E2%9C%93&q=%22def+arange%22+path%3Anumpy%2Fcore&type=

有人能告诉我吗?

【问题讨论】:

  • 快速提示:如果它显示 <built-in function whatever>,则表示它是 C 语言,而不是 Python。你不会为它找到def 声明。
  • numpy 在后台编译为 C,这真的是您所追求的吗?
  • @Julien:我不认为有任何 C++。它是 Python、C 和 Fortran。
  • type(np.arange) 将显示 builtin 而不是function
  • 虽然这个问题不是很好,但它有合法的非平凡答案,证明了一些初学者在挖掘 numpy 代码时相对困难。

标签: python numpy


【解决方案1】:

numpy.arraynumpy.arange 是用 C 语言编写的。你可以看出来,因为它们说的是“内置”:

>>> numpy.array
<built-in function array>
>>> numpy.arange
<built-in function arange>

这意味着没有def 声明。相反,我们看看它们来自哪个模块:

>>> numpy.array.__module__
'numpy.core.multiarray'
>>> numpy.arange.__module__
'numpy.core.multiarray'

导航到对应的source file,看看控制模块导出函数的array

{"array",
    (PyCFunction)_array_fromobject,
    METH_VARARGS|METH_KEYWORDS, NULL},
...
{"arange",
    (PyCFunction)array_arange,
    METH_VARARGS|METH_KEYWORDS, NULL},

numpy.arraynumpy.arange 对应于该文件中的 _array_fromobjectarray_arange。不过,这并不是所有工作发生的地方。您需要继续挖掘以找到所有相关代码。

【讨论】:

  • 如果您不介意,请跟进:为什么我们可以将arange 简称为numpy.arange,而不是numpy.core.multiarray.arange?它似乎也可以与nonzero 一起使用,这不是内置的:numpy.nonzero 可以正常工作,无需说numpy.core.nonzero。然而,这并不总是可行的,因为matplotlib.plot 不起作用,我们不得不说matplotlib.pyplot.plot
  • @FreshAir,使用文档中给出的名称。这一切都取决于如何导入各种模块。有时import numpy as np 就足够了。有时你必须使用from scipy import sparse之类的东西。
【解决方案2】:

这些在 multiarraymodule.c 中定义:

https://github.com/numpy/numpy/blob/820765d762513510a8e46f108e8bc8b366127f8f/numpy/core/src/multiarray/multiarraymodule.c#L4279

Python 中的array 函数在 C 中是 _array_fromobject(),而 Python 中的 arange 函数在 C 中是 array_arange()

【讨论】:

    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多