为什么numpy整数减法会产生一个float64?

时间:2017-06-30 05:08:20

标签: python numpy type-conversion

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

list

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

2 个答案:

答案 0 :(得分:9)

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

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

替代方案是遵循例如 c 规则,它会将所有内容都转换为uint64。但当然,这可能导致上下溢的非常奇怪的结果。

如果您想提前了解最终的类型,请查看np.result_type()np.can_cast()np.promote_types()。在文档中阅读这些内容也可能有助于您更好地理解这个问题。

答案 1 :(得分:3)

我没有关于numpy的专家,但是,我怀疑,因为float64是最小的数据类型,可以同时适合int64uint64的域将两个操作数转换为float64,以便操作始终成功。

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