我已经找到了numpy.ma.where()函数的源代码,但似乎正在调用numpy.where()函数,为了更好地理解它,我想看一下。
答案 0 :(得分:2)
大多数Python函数是用Python语言编写的,但是有些函数是用更本地的(通常是C语言)编写的。
您可以使用几种技术来询问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
版本采用三个数组,它们相互广播。返回数组具有常见的广播形状,其元素选自x
和y
,如上一个问题How exactly does numpy.where() select the elements in this example?
您确实意识到该代码大部分是c
或cython
,并且具有相当多的预处理功能。即使对于有经验的用户,也很难阅读。运行各种测试用例并以这种方式了解发生的情况比较容易。
需要注意的几件事。 np.where
是一个python函数,在将每个输入传递给python之前,python会对它们进行全面评估。这是条件分配,而不是条件评估功能。
除非您通过3个形状匹配的数组或标量x
和y
,否则您需要对广播有很好的了解。
答案 2 :(得分:0)
答案 3 :(得分:0)
C:\Users\<name>\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\numpy\core\multiarray.py
是我找到它的地方。