numpy输出矩阵时出现0. 异常浮点数显示是什么原因?
NumPy矩阵输出
0. 异常显示问题说明 异常本质
你看到的0. 加空白的显示不是计算错误,也不是值为0,是NumPy默认打印规则导致的显示效果:
- 异常位置的实际值是浮点运算产生的、量级在
1e-17~1e-20左右的极小非零数,属于浮点数运算的正常舍入误差 - NumPy默认打印浮点数统一保留4位小数,这个极小值四舍五入到4位小数为
0.0000,为了和同列其他4位长度的数值对齐,NumPy会省略后面的四个0,只显示0.,视觉上就像缺了一块空白。
产生原因
代码中涉及矩阵转置、L2范数计算、浮点数除法多个浮点运算步骤,浮点数采用二进制存储,本身就存在精度限制,理论上应该为0的位置会产生极其接近0的误差值,这个是所有浮点数计算场景的正常现象,不是代码逻辑bug。
验证方式
你可以通过以下代码查看真实值,确认问题:
# 直接打印异常位置的精确值(注意NumPy索引从0开始,第一列第四行对应索引[3,0]) print(X0[3, 0]) # 调整全局打印配置,输出全矩阵完整精度 np.set_printoptions(precision=20, suppress=False) print(X0)
运行后就能看到该位置实际是类似8.67e-19这样的极小值。
解决方法
如果不需要保留这类无意义的极小误差,可以在计算完成后加一步阈值过滤,把过小的值直接置为0:
# 绝对值小于1e-10的数值统一判定为0 X0[np.abs(X0) < 1e-10] = 0 print(X0)
处理后再打印矩阵就不会出现异常的0. 显示了。
内容的提问来源于stack exchange,提问作者Đạt Lê
相关产品推荐
相关产品推荐

