我想在我的实验室实验中尝试使用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表示这个?
答案 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.n
和I.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'] = ...
或者,如果您在两个列表中包含val
和err
,则可以立即定义数组:
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)。