【问题标题】:Model measurement and error in NumPyNumPy 中的模型测量和误差
【发布时间】:2017-02-15 05:35:40
【问题描述】:

我想在我的实验室实验中尝试使用 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 来表示它?

【问题讨论】:

    标签: python numpy scipy octave


    【解决方案1】:

    这种错误传播正是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)。

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

    【讨论】:

    • :你好,我正在搜索错误,我刚看到你的包。我想顺便问一下。例如我正在使用一个numpy函数。我知道这个函数的结果吗有什么错误?或者我必须手动定义它吗?numpy源代码中是否有任何关于此的信息?谢谢
    • uncertainties 通过 uncertainties.unumpy 包支持 NumPy。它允许您执行 sin(array_with_uncertainties) 之类的操作。
    • :感谢您的回复和构建这个包!因为我不太明白,所以我想问你。我知道如果我提供错误,使用不确定性会传播错误。但是,例如,如果我使用一个 numpy 函数,比如说np.interp,有没有办法使用 numpy 或者使用不确定性来知道调用这个函数的结果有什么错误?numpy 函数有什么样的错误?结果?我希望很清楚。谢谢!
    • 与此最接近的是uncertainties.wrap() (pythonhosted.org/uncertainties/…):它从常规函数创建了一个不确定性感知函数。现在,它通常不适用于阵列,因此您的里程可能会有所不同。也许另一个有用的功能是内部unumpy.func_with_deriv_to_uncert_func()uncertainties 模块可以为 Numpy 数组上的函数使用一些以用户为中心的包装器。注意:这个讨论应该在其他地方而不是这里的一串 cmets!
    • :好的,谢谢!(我不知道从哪里开始:)
    【解决方案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,仍然可以让您单独访问字段),或通过切片 @ 987654330@...

    用你的例子,你可以这样做:

    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)
    

    您也可以使用 record 数组,这是基本的结构化数组,带有 __getattr____setattr__ 方法重载,您可以将字段作为属性访问(如 R.val ) 以及索引(如标准R['val'])。当然,由于这些基本方法都被重载了,记录数组的效率不如结构化数组。

    【讨论】:

    • 这似乎正是我正在寻找的东西。谢谢!
    • 有一个程序可以做到这一点并且自动透明地做到这一点:uncertainties。 (免责声明:我是作者!)
    【解决方案3】:

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

    您可以使用numpy's record arrays 来代替结构数组。不过似乎有点多嘴了。

    另外google cache of NumPy for Matlab Users(直接链接对我不起作用)可以帮助一些基本操作。

    【讨论】:

    • 有了 Pierre GM 的回答,我现在看到您的回答是正确的方向。我只是没有立即从文档中看到这一点,抱歉。
    • @queueoverflow:是的,应该包括一个例子!即使是最简单的。他准确地说明了记录数组。
    【解决方案4】:

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

    【讨论】:

    • 这看起来很有趣。我得看看它与常规 NumPy 的表现如何。
    • 应该没问题。这个包的 dev' 帮助改进了 ndarrays 子类的创建。
    • uncertainties 包比正确处理变量之间的相关性具有优势。例如: x+x 由数量包计算错误。 (免责声明:我是不确定性的作者。)
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多