为什么numpy数组的最大值不能用该dtype表示



我正在将NumPy数组从浮点数据类型转换为整数数据类型。在此过程中,我希望将高于dtype允许的最大值的值强制转换为该最大值。但由于某些原因,转换失败,并且转换返回最小值。以下是要复制的代码(Python3,Numpy 1.22.2(,仅以numpy.inf为示例

float_array = numpy.array([[1, +numpy.inf], [2,2]])
dtype = numpy.dtype(numpy.int64)
cut_array = numpy.nan_to_num(float_array, posinf=numpy.iinfo(dtype).max)
int_array = cut_array.astype(dtype)

这将返回int_array[0,1]等于-9223372036854775808。为什么可表示的最大值(约9.2e+18(实际上不适用于dtype int64?

我测试了一点,一个比最大值稍小的值就会起作用,例如使用posinf=numpy.iinfo(dtype).max - 600会导致很好的转换。

根据Warren Weckesser和Tim Roberts的评论:由于double只有53位精度,它不能精确地表示int64,例如。int(float(9223372036854775807)) = 9223372036854775808在本例中,int转换对float近似的原始int值进行了四舍五入,float本质上是在int上加+1,使其溢出。

相关内容

最新更新