NumPy 2.0 彻底移除 np.bool 和平台相关别名(如 np.int、np.float),需改用 bool 或 np.bool_ 及明确位宽类型(如 np.int64、np.float32);字符串 dtype 应使用标准码(如 '?'、'i8');类型注解推荐 bool、int 或 np.int64,避免歧义。
NumPy 2.0 彻底删除了 np.bool(它是 Python 内置 bool 的别名,且长期被标记为弃用)。代码里写 np.bool 会触发 NameError: name 'np.bool' is not defined。
正确做法是:
dtype 参数中,统一改用 Python 原生 bool(推荐)或 np.bool_(NumPy 显式布尔类型)np.array([1, 0], dtype=np.bool) → 改成 np.array([1, 0], dtype=bool) 或 np.array([1, 0], dtype=np.bool_)
bool 而非 np.bool;若需强调 NumPy 语义,可用 np.bool_
注意:np.bool_ 是标量类型(如 np.bool_(True)),而 bool 是 Python 类型;在数组 dtype 中二者等价,但 np.bool_ 更明确表示“NumPy 布尔”,避免和 Python 标量混淆。
np.int、np.float、np.complex 这些模糊别名在 NumPy 2.0 中完全移除。它们曾依赖 C 编译器平台定义(比如 np.int 在 Windows 是 32 位,在 Linux x86_64 是 64 位),导致跨平台行为不一致。
适配方式:
dtype 使用场景,必须显式写出带位宽的类型,例如:np.int64、np.int32、np.float32、np.complex128
np.array([1, 2], dtype=np.int) → 必须改为 np.array([1, 2], dtype=np.int64)(或根据实际需求选 np.int32)np.int,改用 int(Python)、np.int64 或 np.integer(后者是抽象基类,适合泛型约束)常见误判:有人以为 np.int_ 是替代方案 —— 它只是 np.int64 的别名(在多数平台上),但不是标准替代项,且仍受平台影响;应直接选用明确位宽的类型。
立即学习“Python免费学习笔记(深入)”;
字符串形式的 dtype(如 'i'、'b'、'f8')本身未被弃用,但部分旧字符串别名(如 'bool'、'int')在 NumPy 2.0 中不再映射到平台相关类型,而是严格按标准解析或报错。
稳妥做法:
'?' 表示布尔,'i4'/'i8' 表示 int32/int64,'f4'/'f8' 表示 float32/float64'int'、'bool' 这类无位宽字符串;np.dtype('int') 会报 TypeError
np.dtype('i') 的,它默认对应平台 np.int_,但 NumPy 2.0 中该行为已取消 —— 推荐显式写成 np.dtype('i8') 或 np.dtype(np.int64)
字符串别名的隐含性容易掩盖精度问题,尤其在科学计算或序列化场景下,位宽不明确可能导致数据截断或内存浪费。
手动全局替换风险高,尤其当项目混用 np.bool(类型)和 np.bool_(标量)时,容易误替。
可借助:
pylint + numpy-plugin:能捕获 np.bool、np.int 等非法引用pyright 或 mypy 配合 numpy-stubs>=2.0:类型检查阶段报出 dtype 不匹配np.bool → bool(仅限 dtype 上下文);但 np.bool_(...) 必须保留,不能改成 bool(...)(后者生成 Python 标量,行为不同)最易忽略的是:某些老代码把 np.bool 当作函数调用(如 np.bool(x)),这在 NumPy 2.0 中必须改为 bool(x) 或 np.bool_(x),二者语义不同 —— 前者返回 Python bool,后者返回 NumPy 标量,会影响后续向量化操作。