我经常使用以下构造来实现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>]
答案 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()
按预期生产:
你可以通过不让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)