使用不确定包时如何修复 ZeroDivisionError?
How to fix ZeroDivisionError while using uncertainties package?
我有两个 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
肯定有物理意义。但是对于计算,计算机科学无法处理 NaN
或 Inf
,因为它们是不确定的。所以通常我们如何通过添加一个小值来处理这个数学错误。不会有太大影响。
通常在许多数学库中,它们的处理方式如下;
假设我们有 matrix/vector A
,其中可以包含 0。我将除以另一个矩阵。所以在此之前我们可以做下面的预处理。
import sys
eps = sys.float_info.epsilon
A+=eps
这将向所有元素添加一个非常小的值,如 2.220446049250313e-16
。所以通过这样做,你的矩阵分布也将被保留。
希望这会有所帮助。 :)
用某个值 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)
我通过在上面的行中进行以下更改解决了这个问题:
我所做的基本上是通过两个值的除法来传播误差,其中两个参数中的误差从第一原理以正交相加。
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.)
我有两个 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
肯定有物理意义。但是对于计算,计算机科学无法处理 NaN
或 Inf
,因为它们是不确定的。所以通常我们如何通过添加一个小值来处理这个数学错误。不会有太大影响。
通常在许多数学库中,它们的处理方式如下;
假设我们有 matrix/vector A
,其中可以包含 0。我将除以另一个矩阵。所以在此之前我们可以做下面的预处理。
import sys
eps = sys.float_info.epsilon
A+=eps
这将向所有元素添加一个非常小的值,如 2.220446049250313e-16
。所以通过这样做,你的矩阵分布也将被保留。
希望这会有所帮助。 :)
用某个值 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)
我通过在上面的行中进行以下更改解决了这个问题: 我所做的基本上是通过两个值的除法来传播误差,其中两个参数中的误差从第一原理以正交相加。
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.)