【问题标题】:Scipy Shift function losing precisionScipy Shift函数失去精度
【发布时间】: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。以数字方式处理浮点数时,会出现这样的结果。

标签: python numpy scipy


【解决方案1】:

你得到的数字-8.32667268e-17小于float64类型的(负数)machine epsilon。处理浮点数的算法预期会得到这样的结果。您可以在班次后将所有小于机器 epsilon 的值设置为零:

def eps2zero(x, dtype=np.float64):
    """ this sets values < eps to zero in-place """
    x[np.abs(x) < np.finfo(dtype).eps] = 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 2017-02-12
    • 2014-01-13
    • 2011-03-17
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多