Dan*_*oni 13 python types numpy
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
但输出是:
builtins.int
numpy.int64
numpy.float64
Run Code Online (Sandbox Code Playgroud)
所以两个整数的乘法返回一个浮点数!有没有合理的解释呢?
请注意,如果我改为
a = 9223372036854775807
type(b*a)
Run Code Online (Sandbox Code Playgroud)
回报
numpy.int64
Run Code Online (Sandbox Code Playgroud)
如果我把它提高到
a = 92233720368547758100
type(b*a)
Run Code Online (Sandbox Code Playgroud)
返回(在python3中)
builtins.int
Run Code Online (Sandbox Code Playgroud)
和(在python2中)
long
Run Code Online (Sandbox Code Playgroud)
据我所知,必须有一些溢出,但为什么呢?
其实这是很好的观察和提问。这是一个简单的类比:
import numpy as np
a = 9223372036854775808
Run Code Online (Sandbox Code Playgroud)
注意,你正在跨越int限制,它正在进入long int范围
a将产生输出为9223372036854775808L
type(a)将产生输出为<type 'long'>
在下面的情况下,我们保持在int限制范围内
a = 9223372036854775807
Run Code Online (Sandbox Code Playgroud)
这里
a返回输出为9223372036854775807type(a) 返回输出为
<type 'int'>
让我们假设一下b = np.int64(1)。我将解释为什么我采取np.int64(1)而不是np.int64(0)
b*a返回9.2233720368547758e+18,如您所见,它以欧拉形式的小数表示。
type(b*a)回报np.float64
因此,出于上述原因,它被转换为浮点数,即 np.float(64)。欧拉形式的数字总是需要浮点/小数点来表示
考虑的原因b:np.int64(1)如果是np.int64(0),您将永远不会注意到输出,因为结果将全为 0