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

2024-04-25 10:25:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()


Tags: testa2returnifdefstatsk1global
1条回答
网友
1楼 · 发布于 2024-04-25 10:25:19

方法kstest将NumPy数组作为参数传递给Ftrapz。因此,在if语句中,x<a是一个布尔数组,这导致了关于歧义的错误。解决方案不是使用allany,而是重写函数以处理数组。一种典型的方法是使用^{},它获取一个范围列表和一个要在这些范围内执行的函数列表(它们可能是常量)。您的功能可以表示为:

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)]

相关问题 更多 >