为什么负数numpy.flaot64用小数取幂会产生nan?

时间:2018-10-08 18:38:29

标签: python numpy complex-numbers

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

使用Python的float类型的相同数字将返回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

后者中的警告仅在首先执行任何命令之后出现。

我使用numpy.array个浮点数遇到了这种情况,在其他所有情况下(?)的行为都与Python浮点数相同。从floatnumpy.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) 来解决此问题:

numpy.complex

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

我的问题是:为什么?为什么在必要时numpy不返回numpy.float64。例如,将numpy.int64除以 即可转换为>>> ai = np.array([1]) >>> ai.dtype dtype('int64') >>> ai/2 array([ 0.5]) >>> (ai/2).dtype dtype('float64')

numpy.float64

numpy.complex64无法表达计算结果而使用float时为什么不采用相同的原理?

在python 2.7.15上的注释::使用此版本,对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) 解决了这个问题:

Inner Join

这等效于numpy的行为。

1 个答案:

答案 0 :(得分:1)

可能是numpy开发人员没有想到要涵盖这种情况。您可以在Github上提出问题。否则,您只需显式进行complex转换。最好放这个问题,以便numpy开发人员可以解决这个问题。