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()
答案 0 :(得分:0)
方法kstest
将NumPy数组作为参数传递给Ftrapz。所以,在你的if语句中,x<a
一个布尔数组,导致歧义的错误。使用all
或any
的解决方案不,但重写函数以便处理数组。执行此操作的典型方法是使用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)]