NumPy 2.4.6:两个回归缺陷的紧急修复

2026-05-20 27 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:5 分钟

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.tomlrequirements.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 的流水线,升级后务必用上述脚本复核关键输出。


相关推荐