升至1/3给出复数

use*_*890 12 python numpy

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

print((-1000)**(1/3.))
Run Code Online (Sandbox Code Playgroud)

Numpy回答

(5+8.660254037844384j)
Run Code Online (Sandbox Code Playgroud)

Numpy官方教程说答案是nan.您可以在本教程的中间找到它.

ali*_*i_m 7

您正在取代常规Python标量而不是numpy数组.

试试这个:

import numpy as np

print(np.array(-1000) ** (1. / 3))
# nan
Run Code Online (Sandbox Code Playgroud)

不同之处在于numpy不会自动将结果提升为复杂类型,而Python 3标量会被提升为复杂值(在Python 2.7中你只会得到一个ValueError).

正如@jonrsharpe上面给出的链接所解释的那样,负数有多个立方根.要获得您正在寻找的根,您可以执行以下操作:

x = -1000
print(np.copysign(np.abs(x) ** (1. / 3), x))
# -10.0
Run Code Online (Sandbox Code Playgroud)

更新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
Run Code Online (Sandbox Code Playgroud)

更新2

值得注意的是,numpy> = 0.10.0的版本将具有np.cbrt基于C99 cbrt功能的新功能.

  • @ user1700890:请注意,这不是计算多维数据集的根目录:它正在计算`-1000`到电源`0.333333333333333314829616256247390992939472198486328125`,这根本不是一回事.让电源操作猜测你实际上想要一个立方根并且在这种情况下推迟到`cbrt`会破坏连续性并且通常是一件可怕的事情.(它是否也应该猜测第5根?第7根?使用什么标准?)IEEE 754*确实定义了一个`rootn`函数,它的行为方式与奇数`n'的预期相同,给出负有限输入的有限结果. (2认同)