不同版本pandas的to_numpy方法出现显著舍入差异的疑问
pandas 0.25.3与1.3.2版本
to_numpy浮点数舍入差异说明 - 该差异并未体现在
to_numpy的接口文档中是正常情况,因为变动不属于to_numpy本身的功能调整,而是来自pandas底层数值处理逻辑的迭代,相关记录仅会出现在对应版本的发布日志中。 - 差异的核心触发原因:
- pandas 1.0.0版本正式上线扩展dtype体系后,浮点型DataFrame/Series的内部存储逻辑做了重构,
to_numpy做类型转换的中间处理步骤与0.25.x版本完全不同,直接导致了小数末尾的舍入规则变化 - pandas 1.2.x版本修复了多个数值转换场景下的精度损失bug,其中就包含浮点数转numpy数组时的截断逻辑调整,这类底层修复不会单独更新到上层接口的文档里
- pandas 1.0.0版本正式上线扩展dtype体系后,浮点型DataFrame/Series的内部存储逻辑做了重构,
- 额外的影响因素:两个版本
to_numpy的默认返回dtype可能存在细微差异,未显式指定dtype参数时,会导致浮点数二进制表示的精度变化,投射到十进制展示上就是第10位及之后的小数位差异。
方案优化建议:在原有提前保留9位小数的基础上,调用
to_numpy时显式指定dtype参数,例如df.to_numpy(dtype="float64"),可以彻底消除默认参数差异带来的影响。如果有数值一致性校验的需求,建议使用numpy.allclose这类带误差容忍的比较方法,不要直接做全等判断。
内容的提问来源于stack exchange,提问作者BptGrm
相关产品推荐
相关产品推荐

