我有一个分段复杂函数定义
import numpy as np
def foo(x):
return np.piecewise(x, [x>0], [np.exp(1j*x)])
当我尝试评估它时,会引发警告。
print(foo(9.99))
输出:
-0.8444696962887724
C:\Users\pedro\Anaconda3\lib\site-packages\numpy\lib\function_base.py:1151: ComplexWarning: Casting complex values to real discards the imaginary part
y[condlist[k]] = item
这是由于numpy piecewise
,它正在丢弃np.exp(1j*x)
的想象部分...为什么会发生这种情况?通过运行source code警告将在以下行中引发:
if not isinstance(item, collections.Callable):
y[condlist[k]] = item
else:
vals = x[condlist[k]]
if vals.size > 0:
y[condlist[k]] = item(vals)
我无法理解。另外,我该如何解决这个问题?
答案 0 :(得分:3)
问题是第一个数组是一个int / float 数组(在这种情况下是一个标量)。所以piecewise
将首先根据该值构造一个数组,然后从中调用该函数。但此时,数组的类型已经修复。
然而,您可以通过向其添加0j
来解决问题,方法是将其设为复数:
def foo(x):
return np.piecewise(x+0j, [x>0], [np.exp(1j*x)])
# ^ turn x into a complex number
或使用complex(..)
构造函数:
def foo(x):
return np.piecewise(complex(x), [x>0], [np.exp(1j*x)])
# ^ turn x into a complex number
这会产生:
>>> foo(9.99)
array((-0.8444696962887724-0.5356033346142913j))
如果x
已经是数组,您可以使用x.astype(dtype=np.complex)
将其转换为复杂数组。