programming from for engine conectar con python matlab

from - install matlab engine for python



¿Existe una función escalón de heaviside? (7)

A partir de numpy 1.13, es numpy.heaviside .

¿Hay heaviside función de heaviside en Python similar a la de heaviside de MATLAB?

Estoy luchando por encontrar uno.


Es parte de sympy , que puedes instalar con pip install sympy

De los documentos:

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 )

Lo usarías así:

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

También puedes escribir el tuyo:

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

Aunque eso puede no satisfacer sus necesidades si necesita una variable simbólica.


No estoy seguro de si está listo para usar, pero siempre puedes escribir uno:

def heaviside(x): if x == 0: return 0.5 return 0 if x < 0 else 1


No estoy seguro de si la mejor manera de hacer las cosas ... pero aquí está la función que hice.

def u(t): unit_step = numpy.arange(t.shape[0]) lcv = numpy.arange(t.shape[0]) for place in lcv: if t[place] == 0: unit_step[place] = .5 elif t[place] > 0: unit_step[place] = 1 elif t[place] < 0: unit_step[place] = 0 return unit_step


Probablemente el método más simple es solo

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

Esto funciona tanto para números únicos como para matrices numpy, devuelve números enteros, y es cero para x = 0. El último criterio puede ser preferible sobre el step(0) => 0.5 en ciertas circunstancias.


Si está usando la versión numpy 1.13.0 o posterior, puede usar 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. ])

Con versiones anteriores de numpy puedes implementarlo como 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. ])


def heaviside(xx): return numpy.where(xx <= 0, 0.0, 1.0) + numpy.where(xx == 0.0, 0.5, 0.0)

O, si numpy.where es demasiado lento:

def heaviside(xx): yy = numpy.ones_like(xx) yy[xx < 0.0] = 0.0 yy[xx == 0.0] = 0.5 return yy

Los siguientes tiempos son con numpy 1.8.2; algunas optimizaciones se hicieron en numpy 1.9.0, así que intente esto usted mismo:

>>> import timeit >>> import numpy >>> array = numpy.arange(10) - 5 >>> def one(): ... return numpy.where(array <= 0, 0.0, 1.0) + numpy.where(array == 0.0, 0.5, 0.0) ... >>> def two(): ... yy = numpy.ones_like(array) ... yy[array < 0] = 0.0 ... yy[array == 0] = 0.5 ... return yy ... >>> timeit.timeit(one, number=100000) 3.026144027709961 >>> timeit.timeit(two, number=100000) 1.5265140533447266 >>> numpy.__version__ ''1.8.2''

En una máquina diferente, con un numpy diferente:

>>> timeit.timeit(one, number=100000) 0.5119631290435791 >>> timeit.timeit(two, number=100000) 0.5458788871765137 >>> numpy.__version__ ''1.11.1'' >>> def three(): ... return 0.5*(numpy.sign(array) + 1) ... >>> timeit.timeit(three, number=100000) 0.313539981842041