以小数(即十进制,即有理数)取幂的负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浮点数相同。从float
到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)
来解决此问题:
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的行为。
答案 0 :(得分:1)
可能是numpy开发人员没有想到要涵盖这种情况。您可以在Github上提出问题。否则,您只需显式进行complex
转换。最好放这个问题,以便numpy开发人员可以解决这个问题。