在numpy中,为什么减去整数有时会产生浮点数?
list
这似乎只发生在使用多个不同的整数类型(例如有符号和无符号)时,以及没有更大的整数类型可用时。
答案 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
是最小的数据类型,可以同时适合int64
和uint64
的域将两个操作数转换为float64
,以便操作始终成功。
例如,在使用int8
和uint8
的情况下:+128 - (256)
无法放入int8
,因为-128
在int8
中无效,因为它只能回到-127
。同样,我们无法使用uint8
,因为在这种情况下我们显然需要使用符号。因此,我们选择浮动/双重,因为它可以很好地适应两个方向。