为什么对 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. 这是路的尽头吗?


FFIVE
浏览 171回答 2
2回答

慕码人8056858

在幕后,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 转换为 complex,只要它们保持相同的精度水平。但是,即使 cast='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_type 和 np.promote_types 中的逻辑来确定 ufunc 的返回类型。https://docs.scipy.org/doc/numpy/reference/ufuncs.htmlhttps://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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python