numpy浮点数组转torch.tensor时不合理不一致舍入问题问询
问题原因解析
你观察到的“转换时舍入不一致”是显示规则差异+浮点精度固有特性共同导致的,并非numpy转torch的过程中发生了额外舍入:
- float64双精度浮点数无法精确表示所有十进制小数,你示例中的
0.99995、5.99995、555555.99995在内存中存储的实际值本身就和十进制字面量存在微小偏差,部分略大于标称值、部分略小于标称值 - numpy和pytorch的默认打印输出精度规则不同,才会出现你看到的显示层面的舍入差异,实际转换前后的内存值完全一致
验证方法
你可以通过修改打印配置输出更高精度的数值,确认转换过程没有修改原始值:
import numpy as np import torch # 统一设置20位小数打印精度 np.set_printoptions(precision=20) torch.set_printoptions(precision=20) np_array1 = np.array([0.99995]) print(np_array1) print(torch.tensor(np_array1)) # 此时可以看到两者输出的实际值完全相同
解决方案
根据你的使用场景可以选择对应方案:
- 如果仅需要消除显示层面的不一致:统一numpy和pytorch的打印精度即可
# 示例:统一保留4位小数显示 np.set_printoptions(precision=4) torch.set_printoptions(precision=4) - 如果需要完全避免浮点精度导致的数值偏差:可以将原始值按需要的精度放大为整数后再做转换,运算完成后再缩放回原量级
# 示例:需要保留5位小数,先乘1e5转int64 precision = 5 scale = 10 ** precision np_array = np.array([0.99995 * scale], dtype=np.int64) torch_tensor = torch.tensor(np_array) # 后续运算完成后再除以scale恢复原值
注意:PyTorch本身不支持十进制高精度类型,如果业务对精度要求极高,无法接受浮点误差,只能基于整数类型做缩放运算。
内容的提问来源于stack exchange,提问作者Živa Urbančič
相关产品推荐
相关产品推荐

