NumPy幂运算报invalid value encountered in power的原因及解决方法
底层原因
- 你观察到的Python原生运算正常是运算优先级的巧合:Python中
**运算符优先级高于负号,你写的-27**(-1/3)实际等价于-(27 ** (-1/3)),全程是对正数27做幂运算,自然不会出错。如果你写成(-27)**(-1/3),Python原生也会返回复数结果,而非你预期的-0.333... - NumPy的幂运算默认是逐元素直接计算,你传入的数组元素是-27,相当于直接计算
(-27) ** (-1/3),NumPy默认浮点运算不支持返回复数,负数开非整数次方的场景下就会返回nan并抛出无效值警告。
修复方案
根据你的使用场景可选择两种方案:
- 明确需要实数域的奇数次方根时,先取绝对值计算再恢复符号
import numpy as np a = np.array([-27]) b = np.array([-1/3]) sign = np.sign(a) result = sign * (np.abs(a) ** b) # 输出结果:[-0.33333333]
- 需要完整复数域结果时,显式指定数组为复数类型
import numpy as np a = np.array([-27], dtype=np.complex128) b = np.array([-1/3]) result = a ** b # 输出结果:[0.16666667-0.28867513j] 为复数域主根
内容的提问来源于stack exchange,提问作者Muhammet Rıdvan İNCE
相关产品推荐
相关产品推荐

