为什么对 numpy.float64 进行指数化会返回 nan?



当我将负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中的错误。这是路的尽头吗?

在幕后,python 正在转换 float(r(**p 以返回"复杂"类型。

numpy power 函数旨在与 numpy array_like结构一起使用,其中所有项目的大小相同并存储在连续的内存块中,其返回类型从其参数推断出来。

如果您期望复数,最好的方法是使用 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 到复杂的铸造类型,只要它们保持相同的精度水平。但是,它似乎不允许隐式转换任何 ufunc 函数返回类型,即使 casting='same_kind' kwarg 被覆盖。

>>> 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_type 和 np.promote_types 中的逻辑来确定 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')

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

请参阅:https://docs.scipy.org/doc/numpy/reference/c-api.dtype.html

最新更新