升至1/3给出复数

时间:2015-07-05 13:58:56

标签: python numpy

我无法理解以下输出。我希望Numpy能够返回-10(或近似值)。为什么这是一个复杂的数字?

print((-1000)**(1/3.))

Numpy回答

(5+8.660254037844384j)

Numpy官方教程说答案是nan。你可以在this tutorial的中间找到它。

1 个答案:

答案 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

更新1

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

更新2

值得注意的是,versions of numpy >= 0.10.0将基于the C99 cbrt function设置新的np.cbrt功能。