【问题标题】:Why does exponentiating a numpy.float64 return nan?为什么对 numpy.float64 求幂返回 nan?
【发布时间】:2020-02-16 12:06:12
【问题描述】:

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

【问题讨论】:

  • p的值是多少?
  • 这真的是关于复数的问题吗?也许应该更改标签。
  • 这个幂运算产生一个复杂的结果。因此你应该使用复杂的r = np.complex(-12025.433836763057, 0)

标签: python numpy


【解决方案1】:

在幕后,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')

【讨论】:

  • 谢谢!现在更有意义了,感谢答案。
【解决方案2】:

numpy.float64 可能在底层由强类型的 C 语言数据结构表示。 python float 是 pythonic,因此可以很好地与 python 提供的复数处理配合使用。

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

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 2017-05-10
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2021-06-25
    • 2020-01-07
    • 2011-10-23
    相关资源
    最近更新 更多