Я хотел бы предоставить «все» математические функции для числовых объектов, создаваемых модулем (модуль uncertainties.py
, который выполняет вычисления с распространением ошибок) - эти объекты являются числами с неопределенностью .
Каков наилучший способ сделать это?
В настоящее время я переопределяю большинство функций из math
в модуле uncertainties.py
, чтобы они работали с числами с неопределенностью. Одним из недостатков является то, что пользователи, которые хотят сделать from math import *
, должны сделать это после , выполнив import uncertainties
.
Однако взаимодействие с NumPy ограничено базовыми операциями (можно добавить массив чисел с неопределенностью и т. Д.); он (пока) не включает более сложные функции (например, sin ()), которые будут работать с массивами NumPy, которые содержат числа с неопределенностью. Подход, который я до сих пор использовал, состоит в том, чтобы предложить пользователю определить sin = numpy.vectorize(math.sin)
, чтобы новая функция math.sin
(которая работает с числами с неопределенностью) передавалась элементам любого массива Numpy. Один недостаток состоит в том, что это должно быть сделано для каждой интересующей функции пользователем, что является громоздким.
Итак, как лучше всего расширить математические функции, такие как sin()
, чтобы они удобно работали с простыми числами и массивами NumPy?
Подход, выбранный NumPy, заключается в определении собственного numpy.sin
, а не в изменении math.sin
так, чтобы он работал с массивами Numpy. Должен ли я сделать то же самое для моего uncertainties.py
модуля и прекратить переопределение math.sin
?
Кроме того, что было бы наиболее эффективным и правильным способом определения sin
, чтобы он работал как для простых чисел, чисел с неопределенностью, так и для массивов Numpy? Мой переопределенный math.sin
уже обрабатывает простые числа и числа с неопределенностью. Однако векторизация с помощью numpy.vectorize
на «обычных» массивах NumPy, вероятно, будет намного медленнее, чем numpy.sin
.