为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

FFIVE 2022-07-19 10:30:06
当我将负数提高numpy.float64到指数时,我收到一个nan. 为什么不支持复杂的数学?唯一的解决方法是强制转换float吗?>>> from numpy import float64, power>>> r = float64(-12025.433836763057)>>> p = 0.74>>> r**pnan>>> power(r, p)__main__:1: RuntimeWarning: invalid value encountered in powernan>>> float(r)**p(-715.6124638577838+762.049873596874j)>>> 建议的副本有一个类似的问题,答案说明这是numpy. 这是路的尽头吗?
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

在幕后,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.html


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


>>> np.result_type(r, p)

dtype('float64')


查看完整回答
反对 回复 2022-07-19
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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

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


查看完整回答
反对 回复 2022-07-19
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信