请考虑以下内容:
>>> 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
类型的实例。
为什么会这样?
答案 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'>