Heaviside阶跃函数存在吗?

32 投票
8 回答
57971 浏览
提问于 2025-04-17 17:21

在Python里有没有类似于MATLAB的heaviside函数?MATLAB里的这个函数是heaviside

我一直在找,但找不到。

8 个回答

13

这是 sympy 的一部分,你可以通过 pip install sympy 来安装它。

来自文档的内容:

class sympy.functions.special.delta_functions.Heaviside


Heaviside Piecewise function. Heaviside function has the following properties: 

1) diff(Heaviside(x),x) = DiracDelta(x)    ( 0, if x<0 )
2) Heaviside(x) = < [*] 1/2 if x==0        ( 1, if x>0 )

你可以这样使用它:

In [1]: from sympy.functions.special.delta_functions import Heaviside

In [2]: Heaviside(1)
Out[2]: 1

In [3]: Heaviside(0)
Out[3]: 1/2

In [4]: Heaviside(-1)
Out[4]: 0

你也可以自己写一个:

heaviside = lambda x: 0.5 if x == 0 else 0 if x < 0 else 1

不过如果你需要一个符号变量,这样可能不太符合你的需求。

23

最简单的方法可能就是这样:

def step(x):
    return 1 * (x > 0)

这个方法适用于单个数字和numpy数组,返回的是整数,当x等于0时结果是0。在某些情况下,这个最后的条件可能比step(0) => 0.5更合适。

54

如果你使用的是numpy 1.13.0或更高版本,你可以使用 numpy.heaviside 这个功能:

In [61]: x
Out[61]: array([-2. , -1.5, -1. , -0.5,  0. ,  0.5,  1. ,  1.5,  2. ])

In [62]: np.heaviside(x, 0.5)
Out[62]: array([ 0. ,  0. ,  0. ,  0. ,  0.5,  1. ,  1. ,  1. ,  1. ])

如果你用的是旧版本的numpy,你可以这样实现: 0.5 * (numpy.sign(x) + 1)

In [65]: 0.5 * (numpy.sign(x) + 1)
Out[65]: array([ 0. ,  0. ,  0. ,  0. ,  0.5,  1. ,  1. ,  1. ,  1. ])

撰写回答