numpy.int64次int - > numpy.float64

时间:2016-03-10 22:17:18

标签: python numpy types

我正在使用python3和numpy版本1.8.2(与numpy 1.10.4和python2相同的问题)并尝试做一些非常基本的事情:乘以两个整数。

import numpy as np
a = 9223372036854775808
type(a)
b = np.int64(0)
type(b)
type(b*a)

然而输出是:

builtins.int
numpy.int64
numpy.float64

所以两个整数的乘法返回一个浮点数!有没有合理的解释呢?

请注意,如果我改为

a = 9223372036854775807
type(b*a)

返回

numpy.int64

如果我把它提升到

a = 92233720368547758100
type(b*a)

返回(在python3中)

builtins.int

和(在python2中)

long

据我所知,必须有一些溢出,但为什么?

2 个答案:

答案 0 :(得分:1)

实际上这是非常好的观察和质疑。这是一个快速类比:

import numpy as np

a = 9223372036854775808

请注意,您越过int限制,它正在进入long int范围

  

a将生成9223372036854775808L

的输出      

type(a)将生成<type 'long'>

的输出

在下面的情况中,我们将继续int限制

a = 9223372036854775807
  

此处a将输出返回为9223372036854775807

     

type(a)将输出返回为<type 'int'>

让我们假设b = np.int64(1)。我将解释为什么我采用np.int64(1)代替np.int64(0)

  

b*a返回9.2233720368547758e+18,如您所见,它以欧拉形式的小数表示。

     

type(b*a)返回np.float64

因此,由于上述原因,它被转换为float,即np.float(64)。 Euler形式的数字总是需要其表示的浮点/小数点

b视为np.int64(1)的原因:如果是np.int64(0),您将永远不会注意到输出,因为结果将全部为0

答案 1 :(得分:0)

这个答案并不是真正的答案:试图更好地理解这个问题!

使用Python 2.7.13我得到了

In [24]: a = 9223372036854775808; type(a)
Out[24]: long

在python 3.6.0中我得到了

In [24]: a = 9223372036854775808; type(a)
Out[24]: int

这与以下事实是一致的:即使在Python3中表现得像long一样,long仍被称为int。

这可能是报告错误问题的一部分吗?如果我们继续使用Python2,那么你在执行乘法时可以查看存储在变量中的值类型的numpy错误吗? 考虑

In [11]: type(int(9223372036854775807))
Out[11]: int

In [12]: type(int(9223372036854775808))
Out[12]: long


In [13]: a = 9223372036854775808

In [14]: b = np.int64(0)

In [15]: type(9223372036854775808 * np.int64(0)) 
Out[15]: long

In [16]: type(b*a)
Out[16]: numpy.float64

In [17]: type(long(9223372036854775808) * np.int64(0))
Out[17]: long

In [18]: type(int(9223372036854775808) * np.int64(0))
Out[18]: long

In [19]: type(np.int64(9223372036854775808) * np.int64(0))
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-18-93a64125698a> in <module>()
----> 1 type(np.int64(9223372036854775808) * np.int64(0))

OverflowError: Python int too large to convert to C long

号码9223372036854775808存储时间长。

第15行处理器说&#34;很长一段时间int64很长,因为它是最大的容器&#34;。

第16行处理器看到一个as int并且说&#34; int次np.int64是np.int64因为我喜欢将它存储为numpy类型,因为你调用它,但是等等...... 9223372036854775808不能留在int64,所以我现在遇到了麻烦(意想不到的麻烦,因为它只在使用numpy类型时才会发生 - 第19行)。然后我把自己置于&#34;麻烦模式&#34;默认情况下将结果存储在我拥有的最大numpy容器中,即float64&#34;

在Python3中,第15行和第16行的行为有所不同:numpy始终处于&#34;故障模式&#34;因为long类型总是被检测为int:

In [10]: type(9223372036854775808 + np.int64(0))
Out[10]: numpy.float64

In [11]: type(a*b)
Out[11]: numpy.float64