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
最小化,并按预期工作。因此,我现在尝试对定义了多个分布的情况下的代码进行概括。我使用一个不可更改的函数input
pickdist
来选择要计算的预定义分布
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函数和args
a、b
。是否最好将
pickdist=[1,2,3]
作为所有分布的计算对象,或者可能是一个函数
pickdist
,输出
1
2
3
?我明白了。对我来说,似乎您打算将
pickdist
作为一个
int
,具有3个可能的值
1、2、3
(顺便说一句,an可能是一个更好的选择)。但是,从错误消息中,您似乎真的传递了一个numpy数组而不是int。我不确定为什么它会作为numpy数组传递,尽管我猜测使用scipy模块的函数miniz中的args=pickdist是罪魁祸首。我会玩它,明天更新。谢谢你提供有关enum的提示,我没想到这里会用到它。既然我对这些部分使用布尔逻辑,为什么它是一个更好的选择?