首页 > 解决方案 > 为什么用小数求幂时负 numpy.float64 会产生 nan?

问题描述

numpy.float64用小数(即小数,即有理数)取幂的负数将产生nan结果和警告。

使用 Pythonfloat类型的相同数字返回complex结果。

这是一个使用 Python 3.6.6 的最小示例(有关 Python 2.7.15 的评论,请参见下文):

>>> import numpy as np
>>> f = -2.0
>>> npf = np.float64(-2.0)
>>> f**1.1
(-2.0386342710747223-0.6623924280875919j)
>>> npf ** 1.1
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
nan

我尝试了该numpy.power函数得到不同的警告和相同的结果。

>>> np.power(f, 1.1)
__main__:1: RuntimeWarning: invalid value encountered in power
nan
>>> np.power(npf, 1.1)
nan

后者中的警告仅在首先执行之后才会出现。

我使用 s 的浮点数遇到了这个numpy.array问题,在所有其他情况下(?)它的行为与 Python 浮点数相同。float从to的转换是numpy.float64隐式发生的,所以我花了一段时间才找到问题的根源。

现在,我可以通过dtype在创建数组时显式转换为或指定为numpy.complex

>>> npc = np.complex(-2.0)
>>> npc ** 1.1
(-2.0386342710747223-0.6623924280875919j)
>>> np.power(npc, 1.1)
(-2.0386342710747223-0.66239242808759191j)

(请注意输出 O_o 的不同精度,不过我可以忍受)

我的问题是:为什么??为什么 numpynumpy.complex在必要时不返回 a 。它确实转换为何numpy.float64时,例如,划分 a numpy.int64

>>> ai = np.array([1])
>>> ai.dtype
dtype('int64')
>>> ai/2
array([ 0.5])
>>> (ai/2).dtype
dtype('float64')

numpy.float64当无法表达计算结果并使用时,为什么不应用相同的哲学numpy.complex64呢?

对 Python 2.7.15 的评论:float在这个版本中,用小数对 a求幂会引发异常,显式使用complex可以解决问题:

>>> f ** 1.1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power
>>> complex(-2.0) ** 1.1
(-2.0386342710747223-0.6623924280875919j)

这相当于 numpy 的行为。

标签: pythonnumpycomplex-numbers

解决方案


可能 numpy 开发人员只是没想过要涵盖这种情况。你可以在Github上提出问题。否则,您只需要complex明确地进行转换。最好提出这个问题,以便 numpy 开发人员可以处理它。


推荐阅读