如何处理Python中的不确定形式

时间:2014-03-20 14:48:36

标签: python numpy complex-numbers

在我的python脚本中的某个时刻,我需要进行计算:1*(-inf + 6.28318530718j).我理解为什么这将返回-inf + nan*j,因为1的虚部显然是0 },但我希望乘法具有预期的-inf + 6.28318530718j的返回值。我也希望任何解决方案对这些乘法中的任何一种都是鲁棒的。有什么想法吗?

编辑:

x*y之类的复数乘法,其中x = (a+ib)y = (c+id)我假设在python中像(x.real*y.real-x.imag*y.imag)+1j*(x.real*y.imag+x.imag*y.real)一样处理,因为这是乘法在数学上的结果。现在,如果说x=1.0y=-inf+1.0j,那么结果将包含nan,因为inf*0将是未定义的。我希望python能够解释*,以便此示例的返回值为-inf+1.0j。似乎没有必要定义我自己的乘法运算符(通过一个函数cmultiply(x,y)),这样我就可以获得所需的结果。

2 个答案:

答案 0 :(得分:3)

简短的回答是关于复数算术的C99标准(附录G)仅识别单个复数无穷大(想想:黎曼球)。 (inf, nan)是其中的一种表示形式,(-inf, 6j)是另一种等效表示形式。

答案 1 :(得分:2)

如果我使用np.log(0),我会收到如下警告:

>>> 1*(np.log(0) + 6.28318530718j)
__main__:1: RuntimeWarning: divide by zero encountered in log
__main__:1: RuntimeWarning: invalid value encountered in cdouble_scalars
(-inf+nan*j)

我会建议不要试图"与" infnan。您可以使用numpy.seterr更改numpy的行为:

>>> np.seterr(divide='raise')
{'over': 'warn', 'divide': 'raise', 'invalid': 'warn', 'under': 'ignore'}
>>> 1*(np.log(0) + 6.28318530718j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FloatingPointError: divide by zero encountered in log

现在您可以捕获FloatingPointError异常并以一些有用的方式处理它。

请注意,原始答案的nan部分实际上是inf的副作用。如果你这样做:

>>> 1*(2 + 6.28318530718j)
(2+6.28318530718j)

如果乘法的一部分没有复杂的组件,则它不会在另一侧创建nan