NumPy 2.4.5 发布后,社区很快发现了两个影响计算正确性的回归问题——conj() 行为异常和 svd(..., hermitian=True) 返回非酉矩阵。2.4.6 作为快速版本,仅合并 4 个 PR 就完成了修复,支持 Python 3.11–3.14。如果你正在用 2.4.5,这两个缺陷值得立刻关注。
arr.conj() 回归:复数共轭不再可靠
PR #31453 修复了 conj() 的回归。在 2.4.5 中,对某些数组调用 .conj() 可能返回错误结果,直接影响所有依赖复数运算的信号处理、量子计算和傅里叶变换代码。
用以下脚本可以验证你当前版本是否存在该问题:
import numpy as np
print("NumPy version:", np.__version__)
# 构造复数数组
arr = np.array([1 + 2j, 3 - 4j, -5j])
# 正确的 conj() 应将虚部取反
expected = np.array([1 - 2j, 3 + 4j, 5j])
result = arr.conj()
print("输入: ", arr)
print("conj(): ", result)
print("期望: ", expected)
# 逐元素比较
if not np.allclose(result, expected):
print("⚠ conj() 回归存在!结果与期望不符")
else:
print("✓ conj() 正常")
在 2.4.5 的受影响场景下,result 会偏离 expected。2.4.6 修复后,输出应完全一致。
svd(hermitian=True) 返回非酉矩阵:数值正确性受损
PR #31459 修复了更隐蔽的问题:当调用 np.linalg.svd 并设置 hermitian=True 时,返回的酉矩阵不再满足酉性条件($U^H U \neq I$)。这对依赖 SVD 分解的 PCA、低秩近似和协方差估计影响很大——矩阵不再正交,后续计算会悄悄漂移。
验证脚本:
import numpy as np
print("NumPy version:", np.__version__)
# 构造一个 Hermitian 矩阵(实对称即可)
A = np.array([[4.0, 1.0, 2.0],
[1.0, 3.0, 0.5],
[2.0, 0.5, 5.0]])
U, S, Vh = np.linalg.svd(A, hermitian=True)
# 检验酉性:U^H @ U 应接近单位矩阵
identity_check = U.conj().T @ U
deviation = np.max(np.abs(identity_check - np.eye(3)))
print("U^H @ U 与 I 的最大偏差:", deviation)
if deviation > 1e-10:
print("⚠ 非酉矩阵回归存在!偏差过大")
else:
print("✓ 酉性正常,偏差在数值误差范围内")
在 2.4.5 中,deviation 可能显著超出数值误差阈值;2.4.6 修复后应回到 $< 10^{-10}$ 的水平。
升级与排查
升级命令:
pip install --upgrade numpy==2.4.6
如果你在 2.4.5 上已有生产代码,建议做以下排查:
- 复数运算路径:搜索代码中所有
.conj()、np.conj()、np.conjugate()调用,用上面的脚本跑一遍关键数据。 - SVD + hermitian 路径:搜索
np.linalg.svd且传入hermitian=True的位置,检查下游是否依赖酉性假设(比如用 $U$ 做正交投影)。 - 锁版本:在
pyproject.toml或requirements.txt中将 numpy 下界设为>=2.4.6,防止依赖解析回退到 2.4.5。
# pyproject.toml
[project]
dependencies = [
"numpy>=2.4.6",
]
小结
2.4.6 是典型的"快修版"——改动少但针对性强。conj() 回归直接影响复数运算的正确性,svd(hermitian=True) 的非酉问题则会让依赖正交性的算法悄悄出错。两者都不报异常,只是结果偏了,这正是最危险的缺陷类型。如果你在 2.4.5 上跑过涉及复数或 SVD 的流水线,升级后务必用上述脚本复核关键输出。