【问题标题】:How to fix ZeroDivisionError while using uncertainties package?使用不确定性包时如何修复 ZeroDivisionError?
【发布时间】:2020-04-16 19:03:17
【问题描述】:

我有两个unumpy 数组:

A= [390.9999999999952+/-19.77371993328507
 129.99999999999932+/-11.40175425099135
 34.99999999999997+/-5.9160797830996135
 4.999999999999999+/-2.2360679774997894 0.0+/-0 0.0+/-0
 4.999999999999999+/-2.2360679774997894]
B= [33.999999999999964+/-5.830951894845297
 17.33333333333334+/-4.163331998932266
 9.666666666666666+/-3.1091263510296048
 4.999999999999999+/-2.2360679774997894 0.0+/-nan 0.0+/-nan
 4.999999999999999+/-2.2360679774997894]

我想传播他们的错误,同时通过以下方式计算平均比率的错误:

fraction = np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A), np.nan)

但我不知道如何解决我收到的以下错误:

Traceback (most recent call last):
  File "my_code4.py", line 2076, in <module>
    fraction =            np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A), np.nan)
  File "/home/username/anaconda3/lib/python3.6/site-packages/uncertainties/core.py", line 661, in f_with_affine_output
    f_nominal_value = f(*args_values, **kwargs)
ZeroDivisionError: float division by zero

【问题讨论】:

  • 当你用 0 除数时会出现这个错误。比如 10/0、5/0。它只是表明,在您的代码中某处发生了计算,并且分母为零。再次检查每个变量值,并删除值为 0 的所有内容...
  • 嗨,阿贝,感谢您的回复。但是,从某种意义上说,零是有意义的,因为当我将其绘制为错误栏时,我希望在数组中拥有空的“正确”位置。该数组的任何位置都没有值应该意味着缺少错误栏。但是,对于每种情况,这个空箱的位置是未知的,如果可能的话,我想将它们作为 NAN 进行跟踪,因为我只显示了一次代码运行。无论如何可以自动执行此操作吗?
  • 当 B 为 nan 而 A 为 0.0 时,您希望输出如何,反之亦然?我不确定我是否理解您想要的输出。也许您可以为您的输入提供所需的示例输出,以便我们提供更好的帮助。谢谢。

标签: python numpy divide-by-zero uncertainty


【解决方案1】:

0 肯定有物理意义。但是对于计算,计算机科学无法处理NaNInf,因为它们是不确定的。所以通常我们如何通过添加一个小值来处理这个数学错误。不会有太大影响。

通常在许多数学库中,它们的处理方式如下;

假设我们有矩阵/向量 A 可以包含 0。我将除以另一个矩阵。所以在这之前我们可以做下面的预处理。

import sys
eps = sys.float_info.epsilon

A+=eps

这将为所有元素添加一个非常小的值,例如2.220446049250313e-16。因此,通过这样做,您的矩阵分布也将被保留。

希望这会有所帮助。 :)

【讨论】:

  • 除此之外,您还必须对+/-nan 进行一些容忍,然后0。因为不确定的容忍度对任何计算都没有帮助。
【解决方案2】:

用某个值 epsilon 替换任何零 (i.e: 1e-9 或 1e-7) A.clip(1e-9)

fraction = np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A.clip(1e-9)), np.nan)

【讨论】:

    【解决方案3】:

    我通过上面一行中的以下更改解决了这个问题: 我所做的基本上是通过将两个值相除来传播误差,其中两个参数中的误差与第一原理正交相加。

    fraction = np.where(unumpy.nominal_values(B) * unumpy.nominal_values(A) > 0, (unumpy.nominal_values(B)/unumpy.nominal_values(A)) * np.sqrt(np.sum(np.square([unumpy.std_devs(B)/unumpy.nominal_values(B), unumpy.std_devs(A)/unumpy.nominal_values(A)]), axis=0)), 0.)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2019-06-21
      相关资源
      最近更新 更多