1

这在任何地方都有记录吗?为什么会有如此巨大的差异?

# Python 3.2
# numpy 1.6.2 using Intel's Math Kernel Library
>>> import numpy as np
>>> x = np.float64(-0.2)
>>> x ** 0.8
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
nan
>>> x = -0.2 # note: `np.float` is same built-in `float`
>>> x ** 0.8
(-0.2232449487530631+0.16219694943147778j)

这尤其令人困惑,因为根据 thisnp.float64built-infloat除了__repr__.

我可以看到警告np在某些情况下可能有用(特别是因为它可以在 中禁用或启用np.seterr);但问题是返回值nan不是内置提供的复杂值。因此,当您开始使用numpy某些计算时,这会破坏代码,并且不要将其返回值显式转换为内置浮点数。

4

2 回答 2

3

numpy.float可能是也可能不是float,但复数根本不是float

In [1]: type((-0.2)**0.8)
Out[1]: builtins.complex

所以没有float操作结果,因此nan.

如果您不想显式转换为float推荐),请numpy以复数进行计算:

In [3]: np.complex(-0.2)**0.8
Out[3]: (-0.2232449487530631+0.16219694943147778j)
于 2012-12-29T22:29:56.527 回答
1

从浮点运算返回复数的行为当然不常见,并且仅在 Python 3 中引入(例如使用/运算符对整数进行浮点除法)。在 Python 2.7 中,您将获得以下信息:

In [1]: (-0.2)**0.8
ValueError: negative number cannot be raised to a fractional power

在标量上,如果不是np.float64使用np.float,您将获得与floatPython 使用的相同类型。(你要么在 2.7 中得到上述错误,要么在 3.x 中得到复数。)

对于数组,所有 numpy 运算符都返回相同类型的数组,并且大多数 ufunc 不支持从 float > complex 进行强制转换(例如, check np.<ufunc>.type)。

  • 如果您想要的是对标量的一致操作,请使用np.float
  • 如果您对数组操作感兴趣,则必须将数组转换为复杂的:x = x.astype('complex')
于 2012-12-30T00:00:43.613 回答