【问题标题】:Changing floating point behavior in Python to Numpy style将 Python 中的浮点行为更改为 Numpy 样式
【发布时间】:2011-02-26 11:36:55
【问题描述】:

有没有办法让 Python 浮点数遵循 numpy 关于 +/- Inf 和 NaN 的规则?例如,制作1.0/0.0 = Inf

>>> from numpy import *
>>> ones(1)/0
array([ Inf])
>>> 1.0/0.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division

Numpy 的除法函数divide(1.0,0.0)=Inf 但是不清楚它是否可以类似于from __future__ import division 使用。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    你应该看看Sage 是如何做到的。 IIRC 他们将 Python REPL 包装在自己的预处理器中。

    【讨论】:

      【解决方案2】:

      我尝试做类似的事情,但我从来没有想过如何做得很好。但是,我可以告诉你一些我尝试过的方法,但没有奏效:

      1. 设置 float = numpy.float -- python 仍然使用旧的浮点数
      2. 试图将 float.div 更改为用户定义的函数 --“TypeError: can't set attributes of built-in/extension type float”。此外,python 不喜欢你在内置对象中使用 dict 对象。

      我决定进去修改实际的 cpython 源代码,让它做我想做的事,这显然不切实际,但它奏效了。

      我认为这样的事情不可能的原因是float/int/list是在后台用C实现的,它们的行为不能从语言内部干净地改变。

      【讨论】:

        【解决方案3】:

        您可以将所有浮点数包装在 numpy.float64 中,这是 numpy 浮点数类型。

        a = float64(1.)
        a/0 # Inf
        

        其实你只需要在算术运算的左边把浮点数包裹起来,很明显。

        【讨论】:

        • 我正在尝试在 REPL shell 中提供类似 numpy 的浮点运算,因此不能选择显式包装。
        猜你喜欢
        • 2015-11-19
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        • 2014-07-31
        • 2020-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多