我最近开始学习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 并且它是真的,问题是我没有看到这样的错误。然而,那里的讨论似乎包括一些可能的解决方法。
答案 0 :(得分:6)
python中的指数优先于负数运算符。因此-1000**(1/3)
相当于-(1000**(1/3))
。
当您执行此操作 循环时,您获得(-1000)**(1/3)
。这相当于10 * (-1**(1/3))
,其中复杂数字。现在,您拥有的数组使用默认数据类型,因为您没有定义根据documentation确定的任何数据,如下所示:
dtype: 数据类型,可选
阵列所需的数据类型。如果没有给出,那么类型将被确定为保持序列中的对象所需的最小类型。此参数只能用于“upcast”数组。对于向下转换,请使用.astype(t)方法。
所以它可能是np.int16
。
将所有信息放在一起,我们可以得出结论,您的数组没有具有相应的dtype
属性,以便能够保持 {的结果{1}}即使结果存在。
这不会发生外部数组,因为没有(-1000)**(1/3)
。
修复\解决方法:
dtype
答案 1 :(得分:0)
这只是解决问题的捷径。
Entry
明显的numpy数组值不能提升为负数,因为这可能会导致数字复杂。