Определение математических операций (грех…) над массивами NumPy, содержащими объекты - PullRequest
1 голос
/ 07 октября 2009

Я хотел бы предоставить «все» математические функции для числовых объектов, создаваемых модулем (модуль 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.

1 Ответ

0 голосов
/ 09 октября 2009

Похоже на то, что делает сама NumPy для поддержания чистоты: «расширенные» математические операции (грех…), которые работают с новыми объектами, могут быть помещены в отдельное пространство имен. Таким образом, NumPy имеет numpy.sin и т. Д. Эти операции в основном совместимы с операциями math, но также работают с массивами NumPy.

Поэтому мне кажется, что математические функции, которые должны работать с обычными числами и NumPy, массивы и , их аналоги с неопределенностями лучше всего определять в отдельном пространстве имен. Например, пользователь может сделать:

from uncertainties import sin

или

from uncertainties import *  # sin, cos, etc.

В целях оптимизации альтернативой может быть предоставление двух отдельных наборов математических функций: те, которые обобщают функции на простые числа с неопределенностями, и те, которые обобщают их на массивы с неопределенностями:

from uncertainties.math_ops import *  # Work on scalars and scalars with uncertainty

или

from uncertainties.numpy_ops import *  # Work on everything (scalars, arrays, numbers with uncertainties, arrays with uncertainties)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...