Python 为什么numpy整数减法会产生浮点64?

Python 为什么numpy整数减法会产生浮点64?,python,numpy,type-conversion,Python,Numpy,Type Conversion,在numpy中,为什么整数的减法有时会产生浮点数 >>> x = np.int64(2) - np.uint64(1) >>> x 1.0 >>> x.dtype dtype('float64') 这似乎仅在使用多个不同的整数类型(例如,有符号和无符号)以及没有更大的整数类型可用时才会发生。这是numpy作者有意识的设计决策。在决定结果类型时,只考虑操作数的类型,而不考虑其实际值。对于您执行的操作,存在结果超出有效范围的风险,例如,如果减去

在numpy中,为什么整数的减法有时会产生浮点数

>>> x = np.int64(2) - np.uint64(1)
>>> x
1.0
>>> x.dtype
dtype('float64')

这似乎仅在使用多个不同的整数类型(例如,有符号和无符号)以及没有更大的整数类型可用时才会发生。

这是
numpy
作者有意识的设计决策。在决定结果类型时,只考虑操作数的类型,而不考虑其实际值。对于您执行的操作,存在结果超出有效范围的风险,例如,如果减去非常大的
uint64
数字,则结果将不适合
int64
。因此,安全的选择是转换为
float64
,这肯定会符合结果(但可能会降低精度)

x=np.int32(2)-np.uint32(1)
的示例进行比较。这始终可以安全地表示为
int64
,因此选择该类型。对于
x=np.int64(2)-np.uint32(1)
,情况也是如此。这也将产生一个
int64

另一种选择是遵循c规则,将所有内容强制转换为
uint64
。当然,这可能会导致非常奇怪的结果,即流量过大/不足


如果您想提前知道您将使用哪种类型,请查看
np.result\u type()
np.can\u cast()
,以及
np.promote\u types()
。阅读文档中的相关内容也可以帮助您更好地理解这个问题。

但是,我不是numpy方面的专家,我怀疑,由于
float64
是既适合
int64
域又适合
uint64
域的最小数据类型,因此减法会将两个操作数转换为
float64
,从而使操作始终成功


例如,在带有
int8
uint8
的情况下:
+128-(256)
不能放在
int8
中,因为
-128
int8
中无效,因为它只能放回
-127
。同样,我们不能使用
uint8
,因为在这种情况下我们显然需要符号。因此,我们选择浮点/双精度,因为它可以很好地适应两个方向。

当我们用uint32减去int32时,相同的行为不会重复,但结果是int64。看起来numpy提升为float,因为没有更大的整数类型。我找到了有关此转换的任何文档。除了关于这些特定功能的文档(对于更广泛的问题几乎没有什么可说的),您是否知道文档中有部分提到了这一点?我只是找了一会儿,什么也没找到。不,好像很稀少。更多的信息和解释可以通过查看关于该问题的bug报告来找到,例如,这会更详细。