在 scipy.special
中添加矢量化 ufunc#
special
中的许多函数都是标量函数的矢量化版本。 标量函数是手动编写的,矢量化所需的循环是自动生成的。 本节讨论添加新的矢量化特殊函数所需的步骤。
添加新的矢量化函数的第一步是编写相应的标量函数。这可以在 Cython、C、C++ 或 Fortran 中完成。 如果从头开始,则应首选 Cython,因为对于仅熟悉 Python 的开发人员来说,代码更易于维护。 如果主要代码在 Fortran 中,则需要编写 C 包装器来包装代码;有关此类包装器的示例,请参见 specfun_wrappers.c
。
实现标量函数后,通过将条目添加到 functions.json
来注册新函数。generate_ufuncs.py
中的文档字符串解释了格式。 此外,通过将条目添加到 add_newdocs.py
来为新函数添加文档;在文件中查找示例。
在编写 ufunc 文档的 parameters 部分时,参数的类型应为 array_like
。关于参数是否可以例如是实值或复值的讨论应该保存到 description 中。 因此,例如,如果我们编写 Gamma 函数的参数文档,则它应如下所示
Parameters
----------
z : array_like
Real or complex valued argument
在编写 returns 部分的文档时,返回值的类型应为 scalar or ndarray
,因为当给定标量作为参数时,ufunc 返回标量。 另请记住,为返回值提供 name
是可选的,事实上,对于特殊函数通常没有帮助。 因此,对于 Gamma 函数,我们可能有这样的内容
Returns
-------
scalar or ndarray
Values of the Gamma function