python - 提高到 1/3 得到复数

标签 python numpy

我无法理解以下输出。我希望 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/

相关文章:

python - Numpy:作为 Matlab 的赋值和索引

python - 为什么此 Python 子进程命令仅在 Windows 上的 shell=True 时有效?

python-2.7 - Pandas 根据当前值更新列

python - 如何有效地获取 Pandas DataFrame 中行之间的日志变化率?

python - Docker运行停止工作/bin/bash:entrypoint.sh:没有此类文件或目录

python - Cython 中 numpy 数组掩码的性能

python - Cumsum 列,同时跳过行或根据实际 cumsum 的结果在条件上设置固定值

python - 'for x in array' 总是导致排序的 x 吗? [Python/NumPy]

Python:如何有效地创建数组的所有可能的 2 元素交换?

python - 从 pandas 字符串列中提取最多 N 个数字,前面或后面没有任何其他数字