Добавление векторизованных 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