在哪里可以找到numpy.where()源代码?

时间:2019-02-03 02:38:56

标签: python numpy

我已经找到了numpy.ma.where()函数的源代码,但似乎正在调用numpy.where()函数,为了更好地理解它,我想看一下。

4 个答案:

答案 0 :(得分:2)

大多数Python函数是用Python语言编写的,但是有些函数是用更本地的(通常是C语言)编写的。

常规Python函数(“纯Python”)

您可以使用几种技术来询问Python本身在何处定义了函数。可能最便携的使用inspect模块:

>>> import numpy
>>> import inspect
>>> inspect.isbuiltin(numpy.ma.where)
False
>>> inspect.getsourcefile(numpy.ma.where)
'.../numpy/core/multiarray.py'

但这不适用于本机(“内置”)功能:

>>> import numpy
>>> import inspect
>>> inspect.isbuiltin(numpy.where)
True
>>> inspect.getsourcefile(numpy.where)
TypeError: <built-in function where> is not a module, class, method, function, traceback, frame, or code object

本机(“内置”)功能

不幸的是,Python没有提供内置函数的源文件记录。您可以找出哪个模块提供了该功能:

>>> import numpy as np
>>> np.where
<built-in function where>
>>> np.where.__module__
'numpy.core.multiarray'

Python不会帮助您找到该模块的本机(C)源代码,但是在这种情况下,可以在numpy项目中查找具有类似名称的C源代码。我找到了以下文件:

numpy/core/src/multiarray/multiarraymodule.c

在该文件中,我找到了定义列表(PyMethodDef),其中包括:

    {"where",
        (PyCFunction)array_where,
        METH_VARARGS, NULL},

这表明C函数array_where是Python视为"where"的函数。

array_where函数是在同一文件中定义的,并且大部分都委托给PyArray_Where函数。

简而言之

NumPy的np.where函数是用C而不是Python编写的。 PyArray_Where是一个好看的地方。

答案 1 :(得分:2)

首先有where的2个不同版本,一个仅包含condition,而另一个则包含3个数组。

最简单的一个是最常用的,它只是np.nonzero的另一个名称。这将扫描condition数组两次。用np.count_nonzero一次来确定有多少个非零条目,这使它可以分配返回数组。第二步是填写所有非零条目的坐标。关键是它返回一个数组元组,condition的每个维度一个数组。

condition, x, y版本采用三个数组,它们相互广播。返回数组具有常见的广播形状,其元素选自xy,如上一个问题How exactly does numpy.where() select the elements in this example?

的答案所述

您确实意识到该代码大部分是ccython,并且具有相当多的预处理功能。即使对于有经验的用户,也很难阅读。运行各种测试用例并以这种方式了解发生的情况比较容易。

需要注意的几件事。 np.where是一个python函数,在将每个输入传递给python之前,python会对它们进行全面评估。这是条件分配,而不是条件评估功能。

除非您通过3个形状匹配的数组或标量xy,否则您需要对广播有很好的了解。

答案 2 :(得分:0)

您可以在numpy.core.multiarray

中找到代码

答案 3 :(得分:0)

C:\Users\<name>\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\numpy\core\multiarray.py是我找到它的地方。