为什么对numpy.float64求幂会返回nan?

2024-03-29 09:26:44 发布

您现在位置:Python中文网/ 问答频道 /正文

当我将负的numpy.float64提升为指数时,我接收到一个nan。为什么不支持复杂的数学?转换为float的唯一解决方法是什么

>>> from numpy import float64, power
>>> r = float64(-12025.433836763057)
>>> p = 0.74
>>> r**p
nan
>>> power(r, p)
__main__:1: RuntimeWarning: invalid value encountered in power
nan
>>> float(r)**p
(-715.6124638577838+762.049873596874j)
>>> 

建议的副本有一个类似的问题,答案是这是numpy中的一个bug。这是路的尽头吗


Tags: 方法fromimportnumpyvaluemain数学nan
2条回答

numpy.float64可能由强类型的C语言数据结构表示。pythonfloat是pythonic的,因此可以很好地处理python提供的复数处理

见:https://docs.scipy.org/doc/numpy/reference/c-api.dtype.html

在幕后,python正在转换浮点(r)**p以返回“复杂”类型

numpy幂函数用于处理类似numpy array_的结构,其中所有项大小相同,存储在连续的内存块中,其返回类型由其参数推断

如果需要复数,最好的方法是使用complex64或complex128类型。这些需要更多的内存,因为每个复杂类型都由实部和虚部组成。所以complex64将由两个float32数字组成,complex128将由两个float64数字组成

>>> import numpy as np
>>> r = np.complex128(-12025.433836763057)
>>> p = 0.74
>>> np.power(r, p)
(-715.6124638577835+762.0498735968736j)

您也可以在幂函数中直接强制转换:

>>> import numpy as np
>>> r = np.float64(-12025.433836763057)
>>> p = 0.74
>>> np.power(r.astype(np.complex128), p)
(-715.6124638577835+762.0498735968736j)

但最简单的方法可能只是改变幂函数的返回类型,以期望得到一个复数:

>>> import numpy as np
>>> r = np.float64(-12025.433836763057)
>>> p = 0.74
>>> np.power(r, p, dtype=np.complex128)
(-715.6124638577835+762.0498735968736j)

有趣的是,numpy通常允许从float64到复杂的类型转换,只要它们保持相同的精度水平。但是,即使casting='same_kind'kwarg被重写,它似乎也不允许隐式强制转换任何ufunc函数返回类型

>>> np.can_cast(np.float64, complex)
True
>>> np.can_cast(np.float64, np.complex64)
False  
>>> np.can_cast(np.float64, np.complex128)
True

根据文档,如果将标量参数传递给ufunc(与数组相反),它将使用np.result_类型和np.promote_类型中的逻辑来确定ufunc的返回类型

https://docs.scipy.org/doc/numpy/reference/ufuncs.html

https://docs.scipy.org/doc/numpy/reference/generated/numpy.result_type.html#numpy.result_type

>>> np.result_type(r, p)
dtype('float64')

相关问题 更多 >