繁体   English   中英

numpy.int64次int - > numpy.float64

[英]numpy.int64 times int -> numpy.float64

我正在使用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

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

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

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

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

用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行处理器说“长时间int64只要它是最大的容器”。

第16行,处理器看到一个int并说“int times np.int64是np.int64,因为我更喜欢将它存储在numpy类型中,因为你调用它,但等待... 9223372036854775808不能保留在int64中,所以我是现在陷入困境(出乎意料的麻烦,因为当只使用numpy类型时没有发生 - 第19行)。然后我把自己置于“故障模式”,默认情况下将结果存储在我拥有的最大的numpy容器中,即float64“

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM