是否存在重载步骤功能?

876*_*674 27 python matlab

Python中有一个类似于MATLAB的重量级函数heaviside吗?

我很难找到一个.

War*_*ser 46

如果您使用的是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. ])
Run Code Online (Sandbox Code Playgroud)

对于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. ])
Run Code Online (Sandbox Code Playgroud)


clw*_*ght 20

可能最简单的方法就是

def step(x):
    return 1 * (x > 0)
Run Code Online (Sandbox Code Playgroud)

这适用于单个数字和numpy数组,返回整数,并且对于x = 0则为零step(0) => 0.5.在某些情况下,最后一个标准可能更好.

  • @becko绝对更具可读性,但它不适用于numpy数组.如果你尝试它,你会得到`TypeError:只有length-1数组可以转换为Python标量.如果x> 0,那么它的可读性可能比"返回1"更低,这与你在这里的几乎相同. (5认同)

mun*_*unk 14

它是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 )
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它:

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
Run Code Online (Sandbox Code Playgroud)

你也可以写自己的:

heaviside = lambda x: 0.5 if x == 0 else 0 if x < 0 else 1
Run Code Online (Sandbox Code Playgroud)

如果您需要符号变量,则可能无法满足您的需求.


net*_*der 5

我不确定它是否开箱即用,但你总能写一个:

def heaviside(x):
    if x == 0:
        return 0.5

    return 0 if x < 0 else 1
Run Code Online (Sandbox Code Playgroud)

  • 注意你使用常量0,你可能想要使用0.0和1.0等. (6认同)
  • 或者只是`如果x == 0则返回0.5,否则如果x &lt;0则返回0,否则返回0“。 (2认同)

Nei*_*l G 5

从numpy 1.13开始,它是numpy.heaviside.