np.inf和float('Inf')之间的区别

Are*_*Tor 20 python numpy

NumPy np.inffloat('Inf')?之间有什么区别吗? float('Inf') == np.inf返回True,所以看起来它们是可以互换的,因此我想知道为什么NumPy定义了自己的"inf"常量,何时我应该使用一个常量而不是另一个(考虑样式问题)?

MSe*_*ert 19

TL,DR:没有区别,它们可以互换使用.

除了具有相同的值math.inffloat('inf'):

>>> import math
>>> import numpy as np

>>> np.inf == float('inf')
True
>>> np.inf == math.inf
True
Run Code Online (Sandbox Code Playgroud)

它也有相同的类型:

>>> import numpy as np
>>> type(np.inf)
float
>>> type(np.inf) is type(float('inf'))
Run Code Online (Sandbox Code Playgroud)

这很有趣,因为NumPy也有它自己的浮点类型:

>>> np.float32(np.inf)
inf
>>> type(np.float32(np.inf))
numpy.float32
>>> np.float32('inf') == np.inf  # nevertheless equal
True
Run Code Online (Sandbox Code Playgroud)

因此它具有相同的值和相同的类型math.inf,float('inf')这意味着它可以互换.

使用原因 np.inf

  1. 键入的内容更少:

    • np.inf (6个字符)
    • math.inf (8个字符; python 3.5中的新字符)
    • float('inf') (12个字符)

    这意味着如果您已经导入了NumPy,那么与float('inf')(或math.inf)相比,每次出现可以节省6(或2)个字符.

  2. 因为它更容易记住.

    至少对我来说,记住np.inf要比float用字符串调用要容易得多.

    此外,NumPy还为无穷大定义了一些额外的别名:

    np.Inf
    np.inf
    np.infty
    np.Infinity
    np.PINF
    
    Run Code Online (Sandbox Code Playgroud)

    它还定义了负无穷大的别名:

    np.NINF
    
    Run Code Online (Sandbox Code Playgroud)

    同样地nan:

    np.nan
    np.NaN
    np.NAN
    
    Run Code Online (Sandbox Code Playgroud)
  3. 常量是常量

    这一点基于CPython,在另一个Python实现中可能完全不同.

    一个floatCPython的情况下需要24个字节:

    >>> import sys
    >>> sys.getsizeof(np.inf)
    24
    
    Run Code Online (Sandbox Code Playgroud)

    如果您可以重复使用相同的实例,那么与创建大量新实例相比,您可能会节省大量内存.当然,如果你创建自己的inf常量,这一点就是静音,但如果不这样做,那么:

    a = [np.inf for _ in range(1000000)]
    b = [float('inf') for _ in range(1000000)]
    
    Run Code Online (Sandbox Code Playgroud)

    b将使用24*1000000字节(~23 MB)的内存a.

  4. 访问常量比创建变量更快.

    %timeit np.inf
    37.9 ns ± 0.692 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
    %timeit float('inf')
    232 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
    %timeit [np.inf for _ in range(10000)]
    552 µs ± 15.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    %timeit [float('inf') for _ in range(10000)]
    2.59 ms ± 78.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    Run Code Online (Sandbox Code Playgroud)

    当然,您可以创建自己的常量来对抗这一点.但是,如果NumPy已经为你做了那件事,为什么还要烦恼呢.

  • @ berna1111是的,但是绝对不要使用`ìs'比较数字。“ is”用于引用相等,**不用于值相等。如果需要比较数字(“ nan”除外,则必须使用“ isnan”功能)始终使用“ ==”,而不要使用“ is”。 (2认同)
  • 比较不同“ inf”表示形式的长度的第一个参数并不完全公平,因为numpy被导入为“ np”。您也可以将数学运算导入为m并使用m.inf(尽管我不一定推荐这样做)。 (2认同)
  • @n1000 当我写下答案时,Python 3.5 并不是那么常见(所以几乎每个人都无法使用 `math.inf`),所以比较更针对 `float('inf')` (和更倾向于通常的导入名称)。然而,由于人们可以轻松地自己创建常数,这一点实际上是无声的。这主要取决于您已经导入的包,因为仅使用“inf”进行额外导入有点毫无意义。但谢谢你提出这个问题。 (2认同)