Python 如何修复';TypeError:hasattr():属性名称必须是字符串';错误?

Python 如何修复';TypeError:hasattr():属性名称必须是字符串';错误?,python,numpy,pymc,Python,Numpy,Pymc,我有以下代码: import pymc as pm from matplotlib import pyplot as plt from pymc.Matplot import plot as mcplot import numpy as np from matplotlib import rc res = [18.752, 12.450, 11.832] v = pm.Uniform('v', 0, 20) errors = pm.Uniform('errors', 0, 100, siz

我有以下代码:

import pymc as pm
from matplotlib import pyplot as plt
from pymc.Matplot import plot as mcplot
import numpy as np
from matplotlib import rc

res = [18.752, 12.450, 11.832]

v = pm.Uniform('v', 0, 20)

errors = pm.Uniform('errors', 0, 100, size = 3)

taus = 1/(errors ** 2)

mydist = pm.Normal('mydist', mu = v, tau = taus, value = res, observed = True)

model=pm.Model([mydist, errors, taus, v, res])
mcmc=pm.MCMC(model) # This is line 19 where the TypeError originates
mcmc.sample(20000,10000)

mcplot(mcmc.trace('mydist'))
由于某些原因,它不起作用,我得到了“TypeError:hasattr():attribute name必须是string”错误,跟踪如下:

 Traceback (most recent call last):

  File "<ipython-input-49-759ebaf4321c>", line 1, in <module>
runfile('C:/Users/Paul/.spyder2-py3/temp.py', wdir='C:/Users/Paul/.spyder2-py3')

  File "C:\Users\Paul\Miniconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile
execfile(filename, namespace)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 85, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)

  File "C:/Users/Paul/.spyder2-py3/temp.py", line 19, in <module>
mcmc=pm.MCMC(model)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\MCMC.py", line 82, in __init__
**kwds)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\Model.py", line 197, in __init__
Model.__init__(self, input, name, verbose)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\Model.py", line 99, in __init__
ObjectContainer.__init__(self, input)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\Container.py", line 606, in __init__
conservative_update(self, input_to_file)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\Container.py", line 549, in conservative_update
if not hasattr(obj, k):

TypeError: hasattr(): attribute name must be string
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行文件('C:/Users/Paul/.spyder2-py3/temp.py',wdir='C:/Users/Paul/.spyder2-py3')
文件“C:\Users\Paul\Miniconda3\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py”,第685行,在runfile中
execfile(文件名、命名空间)
文件“C:\Users\Paul\Miniconda3\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py”,第85行,在execfile中
exec(编译(打开(文件名'rb').read(),文件名'exec'),命名空间)
文件“C:/Users/Paul/.spyder2-py3/temp.py”,第19行,在
mcmc=pm.mcmc(型号)
文件“C:\Users\Paul\Miniconda3\lib\site packages\pymc\MCMC.py”,第82行,在\uuu init中__
**kwds)
文件“C:\Users\Paul\Miniconda3\lib\site packages\pymc\Model.py”,第197行,在\uuu init中__
模型。初始化(self,input,name,verbose)
文件“C:\Users\Paul\Miniconda3\lib\site packages\pymc\Model.py”,第99行,在\uuu init中__
ObjectContainer.\uuuu init\uuuuu(self,input)
文件“C:\Users\Paul\Miniconda3\lib\site packages\pymc\Container.py”,第606行,在\uuu init中__
保守的\u更新(自我,将\u输入到\u文件)
文件“C:\Users\Paul\Miniconda3\lib\site packages\pymc\Container.py”,第549行,在保守更新中
如果不是hasattr(对象,k):
TypeError:hasattr():属性名称必须是字符串
如何使其工作并输出“mydist”

编辑:起初我无意中发布了一条错误的跟踪


Edit2:这一切都是因为res没有名称,因为它是一个数组,但我不知道如何为它指定名称,所以它会起作用。

我必须承认我不熟悉pymc,但将其更改为以下内容至少使应用程序运行:

mydist = pm.Normal('mydist', mu = v, tau = taus, value = res, observed = False)

mcmc=pm.MCMC([mydist, errors, taus, v, res])
这似乎是因为您将所有内容包装在一个模型中,该模型是
ObjectContainer
的扩展,但由于您向其传递了一个列表,Container.py中的MCMC
file\u items
尝试使用
replace
将列表中的索引
4
分配给某些内容,但是由于
模型
是一个
对象容器
它在它的
\uuuuu dict\uuuuuu
中分配了键
4
,导致了你得到的奇怪的
类型错误。移除包装
Model
导致
MCMC
正确使用
ListContainer

现在,,Model.py中可能有一个bug,关于数据库中不存储可观察的随机数据的地方-表达式是self.stochastics | self.deterministics中对象的
,但我怀疑它应该也包括
self.observative(可观察的)随机数据
,所以我需要将
可观察的
更改为
False
或最后一行将抛出一个
键错误


我对pymc不太熟悉,无法确定它是真的还是bug或期望的行为,因此我将它留给您提交一份关于它的报告。

您只需将
res
定义为numpy数组:

res = np.array([18.752, 12.450, 11.832])

然后您将在这里得到一个错误
mcmc.trace('mydist')
,因为
mydist
是观察数据,因此不进行采样。您可能想绘制其他变量…

回溯片段似乎不包含该错误。@丹尼尔,我无意中发布了错误的一个,对不起,我更改了它。对不起,但这是错误的,因为observed=False表示您不考虑res,这意味着它不查看值(表达式value=res中的值)对不起,但这是我所能做的。如果
mydist
已观察到
True
设置为
True
,则在尝试提取其跟踪时,您将得到一个
KeyError