Python 3.x 如果给出一条关于数组中不明确真值的错误消息,如何调试此代码(代码段)?
下面显示的第一段代码起作用;我的问题是试图使代码块适应我的问题(定义就在下面) 我正在尝试使用下面的函数Python 3.x 如果给出一条关于数组中不明确真值的错误消息,如何调试此代码(代码段)?,python-3.x,error-handling,parameter-passing,chaining,ambiguous-call,Python 3.x,Error Handling,Parameter Passing,Chaining,Ambiguous Call,下面显示的第一段代码起作用;我的问题是试图使代码块适应我的问题(定义就在下面) 我正在尝试使用下面的函数chisq。整个代码基本上是一个函数链(例如,expectperbin,它调用一个分布函数来进行集成);下面的代码有obsperbin、parameterguess、countperbin和初始参数,所有这些参数都是预定义的。仅显示功能链的顶部: from scipy.optimize import minimize from scipy.stats import chisquare def
chisq
。整个代码基本上是一个函数链(例如,expectperbin
,它调用一个分布函数来进行集成);下面的代码有obsperbin
、parameterguess
、countperbin
和初始参数,所有这些参数都是预定义的。仅显示功能链的顶部:
from scipy.optimize import minimize
from scipy.stats import chisquare
def chisq( args ):
## first subscript [0] gives chi-squared value, [1] gives 0 ≤ p-value ≤ 1
return chisquare( obsperbin , expectperbin( args ))[0]
def miniz( chisq , parameterguess ):
## optimization routine to minimize Chi Square (or negative p-value)
globmin = minimize( chisq , parameterguess)
while globmin.success == False:
## self-correcting mechanism if 'success test' fails
try:
globmin = minimize( chisq , parameterguess)
print("ERROR: MINIMIZE LOOPING AGAIN")
break
except globmin.success == True:
print("TA DAA")
break
return globmin
res = miniz( chisq, [initial_mu , initial_sigma] ) ## FULL OPTIMIZED RESULT
print(res)
上面的代码找到了mu
和sigma
的优化值(给出了每个值的初始猜测),使chisq
最小化,并按预期工作。因此,我现在尝试对定义了多个分布的情况下的代码进行概括。我使用一个不可更改的函数inputpickdist
来选择要计算的预定义分布expectperbin
。我的尝试如下:
def chisq( pickdist , args ):
obsperbin = countperbin( pickdist = pickdist )
expperbin = expectperbin( pickdist , args )
return chisquare( obsperbin , expectperbin( pickdist , args ))[0]
def miniz( pickdist ):
if pickdist == 1:
parameterguess = paramguess1
elif pickdist == 2:
parameterguess = paramguess2
elif pickdist == 3:
parameterguess = paramguess3
else:
raise ValueError(errmsg)
globmin = minimize( chisq , parameterguess, args = (pickdist))
return globmin
运行该代码将创建错误消息
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
并在读取obsperbin=countperbin…
的代码行(从上方,在chisq
下)和从下方读取的代码行(如果pickdist==1:
def countperbin( pickdist ):
## counts multiplicity of observed values per bin via dataset
if pickdist == 1:
dataset = data
elif pickdist == 2:
dataset = logdata
elif pickdist == 3:
dataset = logdata
else:
raise ValueError(errmsg)
## I can delete the code below if it's too long
bincount = []
subintervals = binbounder( pickdist )
for jndex in range(len( subintervals )):
if jndex != len( subintervals ) - 1:
summ = 0
for value in dataset:
if value > subintervals [ jndex ] and value <= subintervals [ jndex + 1 ]:
summ += 1
bincount.append(summ)
if jndex == len( subintervals ) - 1:
pass
return bincount
obsperbin1 = countperbin( 1 )
... ## rest not shown to keep post short but can add if requested
def countperbin(pickdist):
##通过数据集统计每个料仓观察值的多重性
如果pickdist==1:
数据集=数据
elif pickdist==2:
数据集=日志数据
elif pickdist==3:
数据集=日志数据
其他:
提升值错误(errmsg)
##如果下面的代码太长,我可以删除它
bincount=[]
子间隔=binbounder(pickdist)
对于范围内的jndex(len(子间隔)):
如果jndex!=len(子区间)-1:
总和=0
对于数据集中的值:
如果value>subinterval[jndex]和value-Well,则从错误消息来看,pickdist似乎是一个numpy数组,但您的代码似乎需要一个内置的int
。你能详细说明一下吗?请向我们展示pickdist
。在任何情况下,pickdist
都是链接函数的输入。我在最后一块中添加了更多代码,以显示一个示例。至于expectperbin
函数,每个输入pickdist
产生的输出是x
的lambda函数和argsa、b
。是否最好将pickdist=[1,2,3]
作为所有分布的计算对象,或者可能是一个函数pickdist
,输出1
或2
或3
?我明白了。对我来说,似乎您打算将pickdist
作为一个int
,具有3个可能的值1、2、3
(顺便说一句,an可能是一个更好的选择)。但是,从错误消息中,您似乎真的传递了一个numpy数组而不是int。我不确定为什么它会作为numpy数组传递,尽管我猜测使用scipy模块的函数miniz中的args=pickdist是罪魁祸首。我会玩它,明天更新。谢谢你提供有关enum的提示,我没想到这里会用到它。既然我对这些部分使用布尔逻辑,为什么它是一个更好的选择?