NumPy vecdot 能用 axis,mypy 却说关键字不存在
NumPy 2.5.4 的 vecdot 类型重载缺少 axis。默认末轴调用可去掉重复参数,其他轴须保留广播与复数共轭含义。
np.linalg.vecdot(v, n, axis=-1) 按文档可以调用,mypy 却报 Unexpected keyword argument "axis",ty 也提示没有匹配的重载。若错误来自 _GUFunc_Nin2_Nout1,要区分运行函数与随包提供的类型声明。
NumPy 2.5.4 的这组重载列出了 axes,却没有列出单轴参数 axis。明确出现过的检查组合是 mypy 2.4.0 与 ty 0.0.89。静态检查拒绝这个关键字,不等于实际运行接口只允许改成 axes,更不表示应该改用另一个点积函数。
本来就是最后一轴,省去重复参数
vecdot 默认沿最后一轴求向量内积。如果原调用明确就是这个含义,可以去掉多余的 axis=-1:
import numpy as np
vectors = np.array([[0.0, 5.0, 0.0], [0.0, 0.0, 10.0]])
normal = np.array([0.0, 0.6, 0.8])
projection = np.linalg.vecdot(vectors, normal)
对这组输入,结果对应两行向量与同一个法向量的投影。这里没有改变计算轴,只避免把默认值再次传入缺失的声明位置。
若原来沿别的轴计算,可以评估先对两个输入分别用 np.moveaxis() 把目标轴移到末尾,再调用默认 vecdot。需要先核对两个输入的维度与广播关系;一个输入的第 0 轴未必对应另一个输入的第 0 轴,不能机械地给两者移动同一个编号。
不要用 dot 或 vdot 顺手替换
vecdot 对第一个复数向量取共轭,并在剩余维度上采用相应广播。dot、会先展平输入的 vdot 与普通逐元素相乘求和,不一定保留同样的形状或复数语义。只让类型检查通过,却把投影结果改掉,代价更大。
截至 2026 年 10 月 26 日,正式 NumPy 为 2.5.4;开发分支针对类型声明的修改不能当成已经安装的正式修补。需要保留非默认轴接口时,可等待包含相应声明的正式版本,并按项目支持范围更新,而不是编辑环境里的私有 pyi 文件。
复查先跑原静态检查,再用实际的实数、复数和批次形状核对结果与输出轴。没有执行数据运算的类型检查,不能单独证明广播和计算含义仍然正确。


