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

ben*_*min 12 python numpy type-conversion

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

>>> x = np.int64(2) - np.uint64(1)
>>> x
1.0
>>> x.dtype
dtype('float64')
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*anL 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().在文档中阅读这些内容也可能有助于您更好地理解问题.