我无法理解以下输出.我希望Numpy回归-10(或近似).为什么这是一个复杂的数字?
print((-1000)**(1/3.))
Run Code Online (Sandbox Code Playgroud)
Numpy回答
(5+8.660254037844384j)
Run Code Online (Sandbox Code Playgroud)
Numpy官方教程说答案是nan.您可以在本教程的中间找到它.
您正在取代常规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)
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)
值得注意的是,numpy> = 0.10.0的版本将具有np.cbrt基于C99 cbrt功能的新功能.
| 归档时间: |
|
| 查看次数: |
1275 次 |
| 最近记录: |