如何在kstest中使用可调用函数?

时间:2017-03-10 08:50:45

标签: python scipy

def Ftrapz(x):
    global a2
    if x<a:
        a2=0
    elif a<=x<=b:
        a2=(0.5*k1*x**2+b1*x)-(0.5*k1*a**2+b1*a)
    else:
        a2=(0.5*k1*b**2+b1*b)-(0.5*k1*a**2+b1*a)
    return a2

trapz_test=stats.kstest(x0,Ftrapz)

我想使用stats.kstest来测试数组x0和我自己定义的分布函数。但是这个程序有一些错误,那么如何准确使用可调用函数呢? 它说:

  

ValueError:具有多个元素的数组的真值   暧昧。使用a.any()或a.all()

1 个答案:

答案 0 :(得分:0)

方法kstest将NumPy数组作为参数传递给Ftrapz。所以,在你的if语句中,x<a一个布尔数组,导致歧义的错误。使用allany的解决方案,但重写函数以便处理数组。执行此操作的典型方法是使用numpy.piecewise,其中列出范围列表以及要在这些范围上执行的函数列表(它们可以是常量)。您的功能可以表示为:

def Ftrapz(x):
    ranges = [x < a, np.logical_and(a <= x, x <= b), x > b]
    values = [0, lambda x : (0.5*k1*x**2+b1*x)-(0.5*k1*a**2+b1*a), (0.5*k1*b**2+b1*b)-(0.5*k1*a**2+b1*a)]
    return np.piecewise(x, ranges, values)

请注意,NumPy数组的比较不能像标量一样方便地嵌套:a <= x <= b会引发错误。可以通过将相应的公式作为最后一个来避免混乱的logical_and,以便在其他条件失败时执行它:

    ranges = [x < a, x > b]
    values = [0, (0.5*k1*b**2+b1*b)-(0.5*k1*a**2+b1*a), lambda x : (0.5*k1*x**2+b1*x)-(0.5*k1*a**2+b1*a)]