numpy 2.0 中 set_printoptions 仍有效但仅影响 print() 和 str(),repr()(如 jupyter 直接输入变量)默认不生效;需显式设置 legacy='1.25' 才统一控制所有输出。

NumPy 2.0 中 set_printoptions 仍有效,但行为有关键变化
NumPy 2.0 没有移除浮点显示控制,np.set_printoptions 依然可用,但默认行为更严格:它现在**只影响 print() 和 str() 输出,不再隐式改变 repr()(如交互式 REPL 显示)**。这意味着你在 Jupyter 或 IPython 里直接敲变量名,看到的精度可能和 print(arr) 不一致。
实操建议:
- 始终用
np.set_printoptions(precision=3, suppress=True)控制常规输出(precision是小数位数,suppress=True关闭科学计数法) - 若需统一 REPL 显示,Jupyter 用户应额外设置
np.set_printoptions(legacy='1.25')(见下节) -
threshold、linewidth等参数照常生效,与 NumPy 1.x 无差异
为什么在 Jupyter 中改了 set_printoptions 却没生效?
这是 NumPy 2.0 最易踩的坑:Jupyter/IPython 默认调用 repr() 渲染变量,而 NumPy 2.0 的 repr() 绕过了 set_printoptions,除非显式启用兼容模式。
解决方法只有一条路径:
- 在启动脚本或 notebook 开头执行
np.set_printoptions(legacy='1.25') -
legacy='1.25'是唯一被支持的字符串值,它强制恢复 NumPy 1.25 的全部打印逻辑(包括repr()) - 不设
legacy或设为None,repr()就按新规则走——此时precision参数对repr()完全无效
precision 参数实际控制的是“小数位数”,不是“有效数字”
很多人误以为 precision=3 会让 0.0012345 显示成 0.001,其实它控制的是小数点后固定位数,结果是 0.00123(3 位小数)。要控制有效数字,得用 formatter 回调。
例如,强制所有浮点数显示 3 位有效数字:
np.set_printoptions(formatter={'float': lambda x: f'{x:.3g}'})
注意:
-
.3g自动选科学/普通表示,.3f强制小数形式,.3e强制科学计数 -
formatter优先级高于precision,一旦设置,precision就被忽略 - 该回调对每个元素单独调用,大数据集会有轻微性能开销
全局配置要写在 import 之后、首次数组创建之前
NumPy 2.0 的打印配置是惰性初始化的:第一次创建数组或调用 print() 时才读取当前选项。如果先创建了数组,再调用 set_printoptions,已有数组的 repr() 可能缓存旧行为(尤其在 legacy 模式未启用时)。
安全做法:
- 把
import numpy as np和np.set_printoptions(...)放在同一 cell / 文件开头 - 避免在函数内动态修改——这不会影响外部已存在的数组显示
- 检查是否生效:运行
np.get_printoptions(),确认返回字典中'precision'和'legacy'值符合预期
legacy='1.25' 这一行,结果反复调试 precision 却发现 REPL 里数字还是老样子。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











