我无法理解以下输出。我希望Numpy能够返回-10
(或近似值)。为什么这是一个复杂的数字?
print((-1000)**(1/3.))
Numpy回答
(5+8.660254037844384j)
Numpy官方教程说答案是nan
。你可以在this tutorial的中间找到它。
答案 0 :(得分:6)
您正在对常规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
Mark Dickinson对问题的根本原因绝对正确 - 由于舍入错误,1. / 3
与第三个不完全相同,因此x ** (1. / 3)
与立方根不完全相同x
。
更好的解决方案是使用scipy.special.cbrt
,它可以计算出'确切的' cube root而不是x ** (1./3)
:
from scipy.special import cbrt
print(cbrt(-1000))
# -10.0
值得注意的是,versions of numpy >= 0.10.0将基于the C99 cbrt
function设置新的np.cbrt
功能。