NumPy中的模型测量和误差

时间:2012-09-10 12:34:50

标签: python numpy scipy octave

我想在我的实验室实验中尝试使用SciPy套件而不是Octave来进行统计。我的大部分问题都得到了解答here,还剩下另一件事:

我通常会在测量中附加一个错误,在Octave中我只做了以下操作:

R.val = 10;
R.err = 0.1;

U.val = 4;
U.err = 0.1;

然后我会像这样计算I

I.val = U.val / R.val;
I.err = sqrt(
    (1 / R.val * U.err)^2
    + (U.val / R.val^2 * R.err)^2
);

当我进行一系列测量时,我通常使用结构数组,如下所示:

R(0).val = 1;
R(0).err = 0.1;
…
R(15).val = 100;
R(15).err = 9;

然后我可以R(0).val或使用R.val直接访问所有这些内容,并且我有一个包含所有值的列向量,例如mean(R.val)

我如何使用SciPy / NumPy / Python表示这个?

4 个答案:

答案 0 :(得分:5)

这种错误传播正是uncertainties Python包的作用。它通过透明并正确处理相关性来实现:

from uncertainties import ufloat

R = ufloat(10, 0.1)
U = ufloat(4, 0.1)
I = U/R

print I
在自动确定并计算您在示例中手动键入的错误公式后,

打印0.4+/-0.0107703296143。此外,I.nI.s分别是名义价值(您的val)和标准差(您的err)。

也可以使用包含不确定数字的数组(http://pythonhosted.org/uncertainties/numpy_guide.html)。

(免责声明:我是这个软件包的作者。)

答案 1 :(得分:2)

最简单的确是使用NumPy structured arrays,这使您可以定义由其他同构元素(字段)组成的同构元素(记录)数组。

例如,您可以定义

R = np.empty(15, dtype=[('val',float),('err',float)])

然后填写相应的列:

R['val'] = ...
R['err'] = ...

或者,如果您在两个列表中包含valerr,则可以立即定义数组:

R = np.array(zip(val_list, err_list), dtype=[('val',float),('err',float)])

在这两种情况下,您都可以通过索引访问单个元素,例如R[0](这将为您提供特定对象,np.void,仍然可以让您分别访问字段),或者通过切片R[1:-1] ...

举个例子,你可以这样做:

I = np.empty_like(R)
I['val'] = U['val'] / R['val']
I['err'] = np.sqrt((1 / R['val'] * U['err'])**2 + (U['val'] / R['val']**2 * R['err'])**2)

您还可以使用记录数组,这是基本的结构化数组,其中__getattr____setattr__方法重载,以便您可以作为属性访问字段(如在R.val)以及索引(如标准R['val'])。当然,由于这些基本方法过载,记录数组的效率不如结构化数组。

答案 2 :(得分:1)

对于一次测量,简单的namedtuple就足够了。

而不是结构数组,您可以使用numpy's record arrays。虽然看起来有点满口。

同样google cache of NumPy for Matlab Users(直接链接对我来说不起作用)可以帮助一些基本操作的对手。

答案 3 :(得分:0)

在Python中有一个用于表示数量和不确定性的包。它被称为quantities! (还on PyPI)。