【发布时间】:2019-02-18 16:22:21
【问题描述】:
from scipy.ndimage.interpolation import shift
a = np.array([0., 1.])
shift_left = shift(a, -1, cval=np.NaN)
shift_right = shift(a, 1, cval=np.NaN)
print(shift_left)
print(shift_right)
这是上面代码的结果
[ 1. nan]
[ nan -8.32667268e-17]
这是我期望的结果
[ 1. nan]
[ nan 0.]
这种精度损失是否有原因?有谁知道可能导致此问题的原因以及我该如何解决?当我移动包含值 0 的数组时似乎会发生这种情况,尽管据我所知,这可能发生在其他情况下。
【问题讨论】:
-
1e-17基本上为零。我不了解底层算法,但获得这样的微小值并不少见。您应该为您的问题定义一个“epsilon”,可以将其视为零,或者忽略这个微小的值,因为它可能不会影响您的进一步处理。 See this Matlab answer for example. -
如果您想为您的案例提供明确的答案,您将不得不查找
scipy插值函数的源代码。 -
是的,我知道它基本上为零,但是我使用 numpy argmin 来选择具有最小值的索引,并且我想通过选择较小的索引来打破平局。当值不精确时,这不起作用。我设法通过实现自己的 shift 函数来解决它,但我仍然想知道 scipy 的 shift 发生了什么。
-
你可以在
shift_left[np.abs(shift_left) < np.finfo(np.float64).eps] = 0调用shift函数后将它们设置为零。 -
你看到的不是精度损失,而是浮点运算的结果。您的结果仍然小于machine epsilon for the float64 type。以数字方式处理浮点数时,会出现这样的结果。