![](/img/trans.png)
[英]Strange basic computation issue with numpy.int64 and/or 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.