`numpy.piecewise`丢弃了虚构的功能部分。为什么,以及如何解决?

时间:2017-06-24 14:31:52

标签: python numpy

我有一个分段复杂函数定义

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)

我无法理解。另外,我该如何解决这个问题?

1 个答案:

答案 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)将其转换为复杂数组。