Добавление векторизованных ufuncs в scipy.special#

Многие функции в special являются векторизованными версиями скалярных функций. Скалярные функции написаны вручную, а необходимые циклы для векторизации генерируются автоматически. Этот раздел обсуждает шаги, необходимые для добавления новой векторизованной специальной функции.

Первый шаг в добавлении новой векторизованной функции — написание соответствующей скалярной функции. Это можно сделать на Cython, C, C++ или Fortran. Если начинать с нуля, то следует предпочесть Cython, потому что код легче поддерживать разработчикам, знакомым только с Python. Если основной код на Fortran, то необходимо написать C-обёртку вокруг кода; примеры таких обёрток см. в specfun_wrappers.c.

После реализации скалярной функции зарегистрируйте новую функцию, добавив запись в functions.json. Строка документации в generate_ufuncs.py объясняет формат. Также добавьте документацию для новой функции, добавив запись в add_newdocs.py; посмотрите в файле примеры.

При написании раздела параметров документации для ufuncs тип аргумента должен быть array_like. Обсуждение того, может ли аргумент быть, например, вещественным или комплексным, следует сохранить для описания. Так, например, если бы мы документировали параметры для гамма-функции, это должно выглядеть так:

Parameters
----------
z : array_like
    Real or complex valued argument

При документировании раздела возвращаемых значений тип возвращаемого значения должен быть scalar or ndarray поскольку ufuncs возвращают скаляры, когда им даны скаляры в качестве аргументов. Также помните, что предоставление name для возвращаемого значения является необязательным и, действительно, часто не полезным для специальных функций. Так, для гамма-функции у нас может быть что-то вроде этого:

Returns
-------
scalar or ndarray
    Values of the Gamma function