【问题标题】:Irregular error warning: RuntimeWarning: invalid value encountered in double_scalars不规则错误警告:RuntimeWarning:double_scalars 中遇到无效值
【发布时间】:2018-07-26 10:08:43
【问题描述】:

我的代码包含一些随机步骤和指数表达式(单调表达式),需要在最后找到它的根。 "RuntimeWarning: invalid value encountered in double_scalars" 偶尔出现。例如,我跑 5 次时出现 3 或 2 次。你能告诉我这里发生了什么吗? PS:每次我都能得到结果,但这只是警告让我感到困惑。

【问题讨论】:

  • 太棒了。代码?什么是双标量?什么随机步骤?
  • @MatrixTai 很好的问题。在这里展示太复杂了,可惜我没有找到任何简单的例子来展示它。这种错误类型有一些一般的想法或案例。
  • ...还是太缺乏信息了。你在 python 中处理一些double 吗?至少说明一些背景。或者甚至只是显示几行就会向您发出警告。
  • 谢谢,这给了我一个提示。 "exponential+=(T_data[runs][0])*(np.exp(-(x)*(T_data[runs][1])))" 这部分在警告之后。 [运行] 是迭代。 T_data 是一个列表,其中有形状为 (1,2) 的 ndarray。这对您有帮助吗?
  • exp函数好像溢出了,打印-(x)*(T_data[runs][1])) where catched error。

标签: runtime-error


【解决方案1】:

有两种可能的方法来解决它,取决于您的数据。

1.

当你处理一些巨大的数字并超过了double的限制

为了解决这个问题,这个方法实际上是相当数学的。

首先,当且仅当(T_data[runs][0])*(np.exp(-(x)*(T_data[runs][1])))总是小于1.7976931348623157e+308

作为a*e^(-x*b) = e(ln(a)-xb)

因此,(T_data[runs][0])*(np.exp(-(x)*(T_data[runs][1]))) = np.exp(T_data[runs][0]-(x)*(T_data[runs][1]))

请改用np.exp(np.log(T_data[runs][0])-(x)*(T_data[runs][1]))

2.

但是,正如您所说,您每次都会得到结果,(T_data[runs][0])*(np.exp(-(x)*(T_data[runs][1]))) 可能接近于零,它太小以至于 double 无法再保存但不会造成任何伤害,保存为 0

您应该像这样更改您的代码以避免警告。

temp = (x)*(T_data[runs][1])) > 709 ? 0 : np.exp(-(x)*(T_data[runs][1]))
exponential += (T_data[runs][0]) * temp 
## As ln(1.7976931348623157e+308) ~= 709.78

【讨论】:

  • 我已经尝试过使用 'exponential+=np.exp(np.log(T_data[runs][0])-(x)*(T_data[runs][1])) ',但这次错误警告变成了'RuntimeWarning: 除以零在日志中遇到指数+=(T_data[runs][0])*(np.exp(-(x)*(T_data[runs][1])) )'。所以很可能是你在情况2上所说的情况。仍然需要你的建议,因为我不知道情况2的代码的含义。谢谢!
  • @IvyGao,在 numpy 中,exp 和 log 实际上是按照泰勒级数计算的,因此 log 在某些情况下可能会出现除以零。是这样吗,不用方法一了。
  • 非常感谢!我明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 2017-07-14
相关资源
最近更新 更多