为什么NumPy int不是Python int的实例,而NumPy float是Python float的实例?

时间:2018-07-05 08:37:45

标签: python numpy types

请考虑以下内容:

>>> 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_对象不是内置int类的实例,而np.float_对象内置float类型的实例。

为什么会这样?

2 个答案:

答案 0 :(得分:10)

Python整数可以是任意长度:type(10**1000)仍然是int,如果将其输出,则会在屏幕上打印出一个1,然后输出一千个零。

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

因此,它们是不同种类的数字;我认为int人们认为,将一个类别归类为另一个类别与在float下归类numpy一样有意义。最好将它们分开,这样就不会有人将它们混淆是不明智的。

之所以进行拆分,是因为任意大小的整数都很慢,而numpy试图通过坚持使用机器友好的类型来加快计算速度。

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

答案 1 :(得分:1)

由于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'>