如何在python中实现类似步骤的功能

时间:2017-05-27 18:42:54

标签: python-3.x numpy matplotlib

我经常使用以下构造来实现Heaviside步骤函数

def f(x,xm):   
   1 * (xm > c)

我使用相同的方法来实现帕累托分布的CDF。

def pareto_cum(x,xm,a):
     return (1.-(xm/x)**a) * (x > xm)

不幸的是,这会在python 3中产生错误消息。我不明白为什么除零是一个问题,因为总是xm>0。也就是说,默认情况下应该保证x > 0

import numpy as np
import matplotlib.pyplot as plt


x=np.linspace(0,10,100000)
def pareto_cum(x,xm,a):
     return (1.-(xm/x)**a) * (x > xm)

plt.plot(x,pareto_cum(x,2,3))
__main__:2: RuntimeWarning: divide by zero encountered in true_divide
__main__:2: RuntimeWarning: invalid value encountered in multiply
[<matplotlib.lines.Line2D object at 0x7fdf026770b8>]

帕累托分布的CDF https://en.wikipedia.org/wiki/Pareto_distribution

1 个答案:

答案 0 :(得分:1)

这不是错误消息,而是一个警告。如果你愿意,你可以忽略它。唯一的结果就是结果的第一点是nan。否则代码运行正常。

import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(0,10,100000)
def pareto_cum(x,xm,a):
     return (1.-(xm/x)**a) * (x > xm)

plt.plot(x,pareto_cum(x,2,3))
plt.show()

按预期生产:

enter image description here

你可以通过不让0成为数组的一部分来消除警告,例如

x=np.linspace(0,10,100000)
x[0] = 1e-12

您也可以在功能

内查看
def pareto_cum(x,xm,a):
     x[x==0] = 1e-12
     return (1.-(xm/x)**a) * (x > xm)