2

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

我通常会在测量中附加一个错误,在 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

4 回答 4

5

这种错误传播正是不确定性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分别是标称值 (your val) 和标准偏差 (your err)。

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

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

于 2013-04-23T11:20:38.233 回答
2

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

例如,您可以定义

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

然后填写相应的列:

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

或者,如果您的valanderr在两个列表中,您可以一次定义数组:

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

在这两种情况下,您都可以通过索引访问单个元素,例如R[0](这会给您一个特定的对象 a 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__方法以这样的方式重载,您可以将字段作为属性(如 in R.val)和索引(如 standard R['val'])访问。当然,由于这些基本方法被重载,记录数组不如结构化数组高效。

于 2012-09-10T20:13:25.457 回答
1

对于一次测量,简单的命名元组可能就足够了。

而不是结构数组,您可以使用numpy 的记录数组。不过好像有点多嘴了。

此外,Matlab 用户的 NumPy 谷歌缓存(直接链接对我 atm 不起作用)可以帮助一些基本操作的对应物。

于 2012-09-10T12:53:33.547 回答
0

Python中有一个用于表示数量和不确定性的包。这叫数量!(也在PyPI 上)。

于 2012-09-10T16:02:11.103 回答