NumPy中奇怪的数据类型隐式转换

7
我创建了一个简单的numpy数组,数据类型为uint,如下所示:
import numpy as np
a = np.array([1,2,3], dtype=np.uint)

当我计算时

a[0] + 1

我期望的结果是2,但它给出了:

2.0

为什么np.uint会发生隐式转换为float的情况?请注意,int或np.int64不会发生这种情况。

请注意,通常情况下,numpy标量的提升方式相当神秘,并且文档不够完善。我认为最近可能已经进行了全面改进。编辑:一个更相关的github问题。 - juanpa.arrivillaga
1个回答

1
我能够追踪到这个与 NumPy 存储库密切相关的 GitHub 问题。根据 NumPy 和 SciPy 的主要贡献者之一Robert Kern的说法,结果类型的决定是基于输入类型做出的。NumPy 依赖于具有特定于类型的实现的底层例程,其中两个参数都是相同类型,因此它必须提升为某种公共类型。在这种情况下,问题在于一个类型是无符号的,另一个类型是带符号的:
这是几个因素的结合。支持这些例程的numpy.add() ufunc只有在两个参数具有相同类型时才有特定于类型的实现。因此,ufunc系统需要将参数转换为公共类型。其中一个参数是带符号的,因此需要将两个参数都转换为带符号类型。能够表示通过uint64的最大范围值的最小带符号类型是float64(注意!并非所有uint64值都可以表示为float64浮点数!会丢失精度!但比int64好,因为整个上半部分的值都会丢失)。
请注意,无符号和带符号的numpy类型np.uintnp.int也会发生类似的情况:
>>> import numpy as np
>>> np.uint(0) + np.int64(1)
1.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接