我正在将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,使其溢出。