
NumPy 的 numpy.log 默认仅接受正实数;对负数直接调用会触发警告并返回 nan。解决方法是将输入显式转为复数类型(如 x + 0j),从而启用复数对数运算,正确返回主值对数(含虚部)。
numpy 的 `numpy.log` 默认仅接受正实数;对负数直接调用会触发警告并返回 `nan`。解决方法是将输入显式转为复数类型(如 `x + 0j`),从而启用复数对数运算,正确返回主值对数(含虚部)。
在数学中,实数域内的自然对数 $\ln(x)$ 仅对 $x > 0$ 有定义;但扩展到复数域后,负数的对数是有明确定义的:
$$
\ln(-a) = \ln(a) + i\pi \quad (a > 0)
$$
这是基于欧拉公式 $e^{i\pi} = -1$ 推导出的主值分支(principal value)。NumPy 完全支持该复数语义——但前提是输入必须为复数类型。
默认情况下,若传入纯实数(如 -1.1),numpy.log 会坚持返回实数结果,遇到负数即报 RuntimeWarning: invalid value encountered in log 并返回 nan。关键在于显式提供复数 dtype:
import numpy as np # ❌ 错误:实数输入 → 触发警告,z 为 nan z_bad = np.log(-1.1) # Warning + nan # ✅ 正确:转为复数(+0j 或 dtype=complex) z_good = np.log(-1.1 + 0j) # (0.09531017980432493+3.141592653589793j) z_alt = np.log(np.complex128(-1.1)) # 等效写法 # 验证:exp(log(z)) 应还原原值(数值精度内) print(np.exp(z_good)) # (-1.1+0j)
⚠️ 注意事项:
+ 0j是最简洁、推荐的强制转复数方式,它自动将标量提升为complex128;- 若处理数组,确保整个数组为
complex类型(如arr.astype(complex)),否则混合实/复运算可能隐式降级;- 复数对数具有多值性($\ln(-a) = \ln a + i(\pi + 2k\pi),\, k\in\mathbb{Z}$),NumPy 始终返回主值(虚部 ∈ $(-\pi, \pi]$);
- 在涉及
1j * log(...)的相位计算(如信号处理、量子力学表达式)中,务必使用复数输入,否则中间结果失效。
综上,无需额外库或自定义函数——只需一个 + 0j,即可安全、准确地在 NumPy 中计算负数的自然对数,并无缝融入复数运算流。

















