在Python 3.6中,为什么在一个numpy数组中,一个分数的幂的负数会返回nan?

Nik*_*y D 7 python numpy

我最近开始学习Python,并且我一直在阅读NumPy官方快速入门指南,其中包含用于迭代的这个示例.

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

但是,如果我只是尝试将-1000提高到循环外的(1/3.)的幂,则返回一个值.

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

括号大约-1000,它也返回一个值.

>>> (-1000)**(1/3.)
(5+8.660254037844384j)
Run Code Online (Sandbox Code Playgroud)

为什么nan在for循环中返回相同的操作?我正在使用Python 3.6.3 :: Anaconda自定义(64位).我也尝试了不会向上舍入的不同分数,它也是一样的.使用一个向上舍入到.0的分数它可以工作.

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

编辑: 一些评论提到问题重复NumPy,RuntimeWarning:在电源中遇到无效值 ,这是真的,问题是我没有看到这样的错误.然而,那里的讨论似乎包括一些可能的解决方法.

DAl*_*Ale 7

python中的指数优先于负数运算符.因此-1000**(1/3)相当于-(1000**(1/3)).

当你在做这个操作里面的循环你(-1000)**(1/3).这相当于10 * (-1**(1/3))一个复数.现在,您拥有的数组使用默认数据类型,因为您没有定义根据文档确定的任何数据,如下所示:

dtype: 数据类型,可选

数组所需的数据类型.如果没有给出,那么类型将被确定为保持序列中的对象所需的最小类型.此参数只能用于"upcast"数组.对于向下转换,请使用.astype(t)方法.

所以很可能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)
Run Code Online (Sandbox Code Playgroud)