2009-10-07 61 views
1

我想提供“所有”用于通过模块创建的相同数目的对象的数学函数(的uncertainties.py模块,其与错误传播进行计算) - 这些对象是具有不确定性的数字。定义对象

这样做的最好方法是什么?

目前,我重新定义了模块uncertainties.py中的math的大部分功能,以便它们处理具有不确定性的数字。一个缺点是,想要做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.sin在“常规”NumPy阵列上慢得多。

回答

0

它看起来像遵循NumPy本身所做的一样保持干净:对新对象起作用的“扩展”数学运算(sin ...)可以放在单独的名称空间中。因此,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)