Python与NumPy计算n次方根时返回的是n个根中的哪一个?
Python与NumPy n次方根返回规则说明
对于正实数a的1/n次方(n为正整数)计算场景,Python原生幂运算与NumPy的np.power返回的都是幂函数主值,对应唯一的非负实根,和你猜测的「实值解中的最大值」约定完全一致。
相关的通用规则如下:
- 目前没有强制的ISO标准对该行为做约束,但返回主值是所有主流编程语言、科学计算库的通用行业共识,符合绝大多数非复数计算场景的使用预期。
- 若计算负数底数的1/n次方,Python原生运算会返回复数域的主值(极坐标下辐角落在[0, 2π)区间的最小辐角根),不会优先返回负实根。
- NumPy默认对负数实数底数的分数次幂运算会返回
nan并抛出警告,需要显式将底数转换为复数类型才会返回复数主值,和Python原生行为对齐。 - 若需要获取方程
zⁿ=a的全部n个复数根,可以使用NumPy的np.roots函数构造多项式求解。
代码示例
# 正实数场景,Python和NumPy均返回正实主根 >>> 5 ** (1 / 3) 1.7099759466766968 >>> import numpy as np >>> np.power(5, 1/3) 1.7099759466766968 # 负数底数场景,Python返回复数主值 >>> (-8) ** (1/3) (1.0000000000000002+1.7320508075688772j) # NumPy负数实数底数默认返回nan >>> np.power(-8, 1/3) RuntimeWarning: invalid value encountered in power nan # NumPy显式转复数后返回主值 >>> np.power(-8+0j, 1/3) (1.0000000000000002+1.7320508075688772j) # 获取x³=5的全部三个根 >>> np.roots([1, 0, 0, -5]) array([-0.85498797+1.48088261j, -0.85498797-1.48088261j, 1.70997595+0.j ])
补充说明
该主值约定本质上沿用了复变函数中幂函数的主值定义,将复数的辐角限定在(-π, π]区间内计算,对于正实数底数而言,计算得到的主值刚好对应非负实根,无需额外处理即可满足大部分常规计算需求。
内容的提问来源于stack exchange,提问作者Galen
相关产品推荐
相关产品推荐

