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

问题描述 投票:6回答:2

我最近开始学习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)

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

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

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

python numpy
2个回答
6
投票

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

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

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)

0
投票

这只是为您的问题修复它的捷径。

 def ownpow(a, b):
        if a > 0:
            return a**b
        if a < 0:
            temp = abs(a)**b
            return -1*temp

    a= np.array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,  729]) 

    for i in a:
        print(ownpow(i,(1/3.)))

明显的numpy数组值不能提升为负数,因为这可能会导致复数。

© www.soinside.com 2019 - 2024. All rights reserved.