除以大整数时,Numpy 转换为 python float,这是一个错误吗?

这是一个最小的代码示例:

import numpy as np

x = np.array(1e-35,dtype=np.double)
y = int(1e19)
print( type(x/y) )

y = int(1e20)
print( type(x/y) )

在我的机器上,前者打印numpy.float64,后者打印float。我想具体的数字在不同的机器上会有所不同,但重点是对于小整数,除法保留类型,而对于大整数,类型被转换为 Python 浮点数。我想知道这是否是Numpy中的错误,除了手动将所有内容转换为double之外是否还有其他解决方案。

这似乎无害,但是当我尝试编写 ufunc 并且强制转换仅发生在数组的某些元素上时,返回类型变为 object,并且程序抛出“无法强制提供输出参数”错误。

bingjie000407 回答:除以大整数时,Numpy 转换为 python float,这是一个错误吗?

输出类型发生变化,因为 int(1e19) 可以安全地转换为 np.int64int(1e20) 不能放入 np.int64 中,因此无法安全地转换(您可以检查与y.bit_length())。因此,y 首先保留为纯 Python 对象(大小可变的整数),然后 Python 将其转换为纯 Python 浮点对象,因此结果也是纯 Python 浮点对象。发生这种情况是因为 Numpy 尝试根据本机类型应用自己的语义规则。当它不能使用它们时(由于不安全/不可能的强制转换),应用基于纯 Python 对象的后备语义 导致纯 Python 对象。不过,这似乎是一个 known issue。您可以在 GitHub 上查看相关问题并与 Numpy 开发人员讨论以获取更多信息。

我认为最好的策略是不要依赖这种行为。事实上,当一个类似浮点数的值乘以一个巨大的整数时,这个巨大的整数总是首先被转换为一个类似浮点数的值(因为语义规则)。此转换可能会导致精度损失以及以下乘法。因此,我认为最好自己转换大整数,记住整数值可能无法完美表示。

本文链接:https://www.f2er.com/3871.html

大家都在问