【问题标题】:Why is a NumPy int not an instance of a Python int, but a NumPy float is an instance of a Python float?为什么 NumPy int 不是 Python int 的实例,而 NumPy float 是 Python float 的实例?
【发布时间】:2018-07-05 08:37:44
【问题描述】:

考虑以下几点:

>>> import numbers
>>> import numpy
>>> a = numpy.int_(0)
>>> isinstance(a, int)
False
>>> isinstance(a, numbers.Integral)
True
>>> b = numpy.float_(0)
>>> isinstance(b, float)
True
>>> isinstance(b, numbers.Real)
True

NumPy 的numpy.int_ 和numpy.float_ 类型都在Python 的numeric abstract base class hierarchy 中,但我很奇怪np.int_ 对象不是内置@987654326 的实例@ 类,而 np.float_ 对象是内置 float 类型的实例。

为什么会这样?

【问题讨论】:

    标签: python numpy types


    【解决方案1】:

    Python 整数可以是任意长度:type(10**1000) 仍然是 int,如果你输出它,它会在屏幕上打印出一个 1 和 1000 个 0。

    Numpy int64(这是我机器上的 int_)是由 8 个字节(64 位)表示的整数,超过此值的任何内容都无法表示。例如,np.int_(10)**1000 会给你一个错误的答案 - 但很快;)。

    因此,它们是不同种类的数字;将一个子类化到另一个子类与将int 子类化在float 下一样有意义,这是我假设numpy 人们的想法。最好将它们分开,以免混淆它们是不明智的。

    拆分是因为任意大小的整数很慢,而numpy 试图通过坚持机器友好的类型来加速计算。

    另一方面,浮点是标准的 IEEE 浮点,在 Python 和 numpy 中,我们的处理器都支持开箱即用。

    【讨论】:

      【解决方案2】:

      因为numpy.int_() 实际上是 64 位,而int 可以有任意大小,所以它每输入 2^30 位会使用大约 4 个额外字节。int64 具有恒定大小:

      >>> import numpy as np
      >>> a = np.int_(0)
      >>> type(a)
      <type 'numpy.int64'>
      >>> b = 0
      >>> type(b)
      <type 'int'>
      

      【讨论】:

      • 这不能回答我的问题。 a = np.float_(0) 的类型是numpy.float64,但它仍然是float 的一个实例。我的问题可以改写为“为什么numpy.float64 是float 的子类,但numpy.int64 不是int 的子类?”
      • @ArtemMavrin int 可以有任意大小,每输入 2^30 个比特,它就会使用大约 4 个额外字节。int64 具有恒定大小。
      • 谢谢,这个推理更有意义,并且与目前为止的其他答案一致。
      猜你喜欢
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 2011-10-11
      • 2021-03-06
      • 1970-01-01
      • 2019-07-10
      • 2020-04-26
      相关资源
      最近更新 更多