当前位置: 首页 > 面试题库 >

Python的numpy.exp函数中的溢出错误

白坚壁
2023-03-14
问题内容

我想这样使用numpy.exp

cc = np.array([
    [0.120,0.34,-1234.1]
])

print 1/(1+np.exp(-cc))

但这给了我错误:

/usr/local/lib/python2.7/site-packages/ipykernel/__main__.py:5: RuntimeWarning: overflow encountered in exp

我不明白为什么?我怎样才能解决这个问题?看来问题出在第三个数字上(-1234.1)


问题答案:

就像fuglede所说,这里的问题是np.float64无法处理最大为的数字exp(1234.1)。尝试np.float128改用:

>>> cc = np.array([[0.120,0.34,-1234.1]], dtype=np.float128)
>>> cc
array([[ 0.12,  0.34, -1234.1]], dtype=float128)
>>> 1 / (1 + np.exp(-cc))
array([[ 0.52996405,  0.58419052,  1.0893812e-536]], dtype=float128)

但是请注意,使用扩展精度存在某些怪癖。它可能无法在Windows上运行;您实际上并没有获得完整的128位精度;当数字通过纯python时,您可能会失去精度。您可以在此处阅读有关详细信息的更多信息。

对于大多数实际目的,您可能近似1 / (1 + <a large number>)为零。也就是说,只要忽略警告并继续前进即可。Numpy会为您处理近似值(使用时np.float64):

>>> 1 / (1 + np.exp(-cc))
/usr/local/bin/ipython3:1: RuntimeWarning: overflow encountered in exp
  #!/usr/local/bin/python3.4
array([[ 0.52996405,  0.58419052,  0.        ]])

如果要禁止显示警告,可以使用scipy.special.expitWarrenWeckesser在对该问题的评论中建议的,:

>>> from scipy.special import expit
>>> expit(cc)
array([[ 0.52996405,  0.58419052,  0.        ]])


 类似资料:
  • 问题内容: 我在网上搜索过,找不到适合此问题的解决方案 导致此异常的代码 我想知道发生此异常的实际原因,有人说该日期不在有效范围内,但对我来说这没有任何意义,如果可以的话,可以是一个范围。是否取决于我们使用的系统。也想知道这个问题的一个好的解决方案。 谢谢。 问题答案: 从平台的C库调用基础函数。例如,您发布的上述代码对我来说在Mac OS X上运行得很好,尽管它返回的数字是负数,因为日期早于Un

  • 问题内容: Python 2有两个整数数据类型和,并在必要时自动在它们之间进行转换,尤其是为了避免整数溢出。 我正在Python中模拟C函数,并且想知道是否存在重新启用整数溢出的标准方法。对于随机数,我已经使用 有没有更标准的方式来做同样的事情? 问题答案: 我认为基本思路是合理的,但需要进行一些调整: 您的函数不会在上溢出,但是应该; 一次操作可以超过几次; 还需要考虑以下负值。 考虑到这一点,

  • 问题内容: 有了这段代码,我得到了这个答案。为什么我得到负值? 问题答案: 在您的平台上,np.arange返回dtype’int32’的数组: 数组的每个元素都是32位整数。平方导致结果不适合32位。结果被裁剪为32位,并且仍然解释为32位整数,这就是为什么看到负数的原因。 编辑: 在这种情况下,可以通过在平方之前构造dtype’int64’数组来避免整数溢出: 请注意,使用numpy时,发现的

  • 问题内容: 我正在使用Python编写一些加密算法,但是我以前从未使用过Python。 首先,看一下这段代码,然后我将解释这个问题, x和y的值为, 我不明白代码的第三行。为了理解第三行,我不得不研究函数,我遇到了这个问题, zip函数帮助元组 根据这个问题的答案,代码, 将输出, 但是当我尝试打印时, 我得到这个输出, 为什么我的输出与原始输出不同? 问题答案: 在Python 3中返回一个迭代

  • 问题内容: 我有一个具有一列的目标表。我也有一个具有一列的源表,但是该表中的值无论如何都是整数。 当我尝试将数据UPSERT成从通过声明,我得到一个标准错误。 将数字转换为数据类型数字的算术溢出错误。 我真的不明白为什么会发生这种情况,因为两种数据类型都是相同的。 但是,奇怪的是:当我使用on创建测试表,然后将合并目标更改为时,upsert完成。我也不明白为什么会这样,因为并且在大多数情况下都是相

  • 我尝试运行以下代码。 为什么地图功能会打印