1

我想为模块创建的类似数字的对象提供“所有”数学函数(该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 数组上对其进行矢量化numpy.vectorize可能比numpy.sin.

4

1 回答 1

0

看起来遵循 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)
于 2009-10-09T07:46:38.737 回答