在我的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.0
和y=-inf+1.0j
,那么结果将包含nan
,因为inf*0
将是未定义的。我希望python能够解释*
,以便此示例的返回值为-inf+1.0j
。似乎没有必要定义我自己的乘法运算符(通过一个函数cmultiply(x,y)
),这样我就可以获得所需的结果。
答案 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)
我会建议不要试图"与" inf
和nan
。您可以使用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
。