在numpy中,为什么整数相减有时会产生浮点数?
>>> x = np.int64(2) - np.uint64(1)
>>> x
1.0
>>> x.dtype
dtype('float64')
当使用多种不同的整数类型(例如,有符号和无符号),且没有更大的整数类型可用时,似乎只会出现这种情况。
>>> 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
。uint64
。但这当然可能导致非常奇怪的溢出/下溢结果。np.result_type()
、np.can_cast()
和np.promote_types()
。阅读文档也可能有助于更好地理解问题。我对NumPy不是专家,但我怀疑由于float64
是能够适应int64
和uint64
域的最小数据类型,所以减法操作将两个操作数都转换为float64
,以便该操作始终成功。
例如,在使用int8
和uint8
时:+128 - (256)
无法适应int8
,因为-128
在int8
中无效,它只能回到-127
。同样,在这种情况下我们不能使用uint8
,因为我们显然需要符号。因此,我们采用浮点数/双精度数,因为它可以很好地适应两个方向。