【问题标题】:scipy interp1d cannot handle infinite numberscipy interp1d 无法处理无限数
【发布时间】:2021-07-28 04:27:32
【问题描述】:

我有一个函数 y = ax + b,其中 a 和 b 是常量。我想找出y的最大值。我们知道如果a = 0那么y = b,否则y的最大值是无穷大。所以我尝试使用 scipy.interpolate.interp1d 来得到答案。运行下面的示例 2 将导致错误消息。

from scipy import interpolate
import math

# example 1 (works): y = x + 0
func1 = interpolate.interp1d([1,2], [1,2], fill_value='extrapolate')
print(func1(math.inf)) # this will print inf as expected

# example 2 (doesn't work): y = 1
func2 = interpolate.interp1d([1,2], [1,1], fill_value='extrapolate')
print(func2(math.inf)) # I'm expecting 1, however it showed array(nan)

错误信息:

RuntimeWarning: invalid value encountered in multiply
  y_new = slope*(x_new - x_lo)[:, None] + y_lo

编辑: 用一个非常大的数字替换 math.inf,比如 func2(9223372036854775807) 也可以。

【问题讨论】:

  • 问题不在于interp1d 无法处理无限数。你在第一种情况下反驳了这一点,它工作得很好。问题是这条线的斜率为 0。它在 x 中是渐近的。它没有办法选择新的点来推断。我认为这是一个“不要那样做”的案例。
  • 请查看我关于 0 斜率的编辑

标签: python numpy scipy


【解决方案1】:

这是由于 IEEE 754 标准中定义的使用 inf 进行算术运算的规则。规则是:

  1. 对于任何x > 0,我们都有x * inf -> inf
  2. 0 * inf = nan
  3. 对于任何x < 0,我们有x * inf -> -inf

规则 2 的原因在 elsewhere 讨论。

如果我们检查您的错误消息中的代码行,我们可以弄清楚发生了什么:

y_new = slope * (x_new - x_lo)

对于您的两个示例,括号中的术语的值为 inf。在您的第一个示例中slope = 1,因此我们应用第一条规则并获得1 * inf -> inf。但是,在您的第二个示例中,slope = 0 所以我们必须使用第二条规则,我们得到0 * inf -> nan

【讨论】:

  • 好收获。我没注意到。
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2013-10-11
  • 1970-01-01
相关资源
最近更新 更多