numpy.int64次int - > numpy.float64

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)

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

be_*_*ood 1

其实这是很好的观察和提问。这是一个简单的类比:

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返回输出为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

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

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