gpt4 book ai didi

python - 在 Python 3.6 中,为什么在 numpy 数组中负数的分数次方会返回 nan?

转载 作者:太空狗 更新时间:2023-10-29 21:41:33 25 4
gpt4 key购买 nike

我最近开始学习 Python,并且一直在学习 NumPy official quickstart guide其中包括这个迭代示例。

>>> a
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512,
729])
>>> for i in a:
... print(i**(1/3.))
...
nan
1.0
nan
3.0
nan
5.0
6.0
7.0
8.0
9.0

但是,如果我只是尝试在循环外计算 -1000 的 (1/3.) 次方,它会返回一个值。

>>> -1000**(1/3.)
-9.999999999999998

在 -1000 左右加上括号,它也返回一个值。

>>> (-1000)**(1/3.)
(5+8.660254037844384j)

为什么同样的action在for循环中返回nan?我正在使用 Python 3.6.3::Anaconda 自定义(64 位)。我还尝试了不四舍五入的不同分数,结果是一样的。虽然分数四舍五入到 .0,但它仍然有效。

我找不到类似的问题。如果我遗漏了一些非常明显的东西,请原谅。

编辑:一些评论提到问题重复 NumPy, RuntimeWarning: invalid value encountered in power没错,问题是我没有看到这样的错误。然而,那里的讨论似乎包括一些可能的解决方法。

最佳答案

Python 中的求幂比负运算符具有更高的优先级。因此 -1000**(1/3) 等同于 -(1000**(1/3))

当您在内部循环中执行此操作时,您会得到(-1000)**(1/3)。这等于 10 * (-1**(1/3)),这是一个复数。现在您拥有的数组使用默认数据类型,因为您没有定义任何根据 documentation 确定的数据类型。如下:

dtype : data-type, optional

The desired data-type for the array. If not given, then the type will be determined as the minimum type required to hold the objects in the sequence. This argument can only be used to ‘upcast’ the array. For downcasting, use the .astype(t) method.

所以它可能是np.int16

将所有信息放在一起,我们可以得出结论,您的数组未配备适当的dtype 属性,无法保存 (-1000)**(1/3) 的结果,即使结果存在

这不会发生在数组之外,因为那里没有假设dtype


修复\解决方法:

>>> a = np.array([-1000, 1], dtype=np.complex)
>>> for i in a:
... print(i**(1/3.))
...
(5+8.66025403784j)
(1+0j)

关于python - 在 Python 3.6 中,为什么在 numpy 数组中负数的分数次方会返回 nan?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49029019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com