我无法理解以下输出。我希望 Numpy 返回 -10
(或近似值)。为什么是复数?
print((-1000)**(1/3.))
NumPy 的答案
(5+8.660254037844384j)
Numpy官方教程说答案是nan
。你可以在 this tutorial 中间找到它.
最佳答案
您正在对常规 Python 标量而不是 numpy 数组求幂。
试试这个:
import numpy as np
print(np.array(-1000) ** (1. / 3))
# nan
不同之处在于 numpy 不会自动将结果提升为复杂类型,而 Python 3 标量会提升为复杂值(在 Python 2.7 中你只会得到一个 ValueError
)。
正如@jonrsharpe 上面给出的链接中所解释的,负数有多个立方根。要获得您正在寻找的根,您可以这样做:
x = -1000
print(np.copysign(np.abs(x) ** (1. / 3), x))
# -10.0
更新1
马克·迪金森 (Mark Dickinson) 关于问题根本原因的说法绝对正确 - 1。/3
由于舍入误差与三分之一不完全相同,因此 x ** (1./3)
与 的立方根不完全相同x
.
更好的解决方案是使用 scipy.special.cbrt
,计算“精确”的立方根而不是 x ** (1./3)
:
from scipy.special import cbrt
print(cbrt(-1000))
# -10.0
更新2
还值得注意的是 versions of numpy >= 0.10.0将有一个基于 the C99 cbrt
function 的新 np.cbrt
函数.
关于python - 提高到 1/3 得到复数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231115/