【问题标题】:How do I add an attribute name to an array?如何将属性名称添加到数组?
【发布时间】:2015-07-07 16:44:14
【问题描述】:

我想知道如何向数组添加属性。

当我这样做时

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

添加了名称“错误”。

但是当我这样做时

 errors2 = [errors1[1], errors1[3], errors1[6]]

我不知道如何添加该名称,并且因为我没有添加它,所以当我尝试创建一个有错误2 的模型时,我收到一个错误,说它没有属性名称。

这是我的完整代码:

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

first_res = [-27.020,3.570,8.191,9.898,9.603,9.945,10.056]
second_res = [18.752, 12.450, 11.832]

v1 = pm.Uniform('v1', -30, 15)
v2 = pm.Uniform('v2', 0, 20)

errors1 = pm.Uniform('errors', 0, 100, size = 7)
errors2 = [errors1[1], errors1[3], errors1[6]] # doesn't have an attribute name

taus1 = 1/(errors1 ** 2)
taus2 = [taus1[1], taus1[3], taus1[6]]

first_dist = pm.Normal('first_dist', mu = v1, tau = taus1, value = first_res, observed = True)
second_dist= pm.Normal('second_dist', mu = v2, tau = taus2, value = second_res, observed = True)

model=pm.Model([first_dist, second_dist, errors1, taus1, v1, v2])
mcmc=pm.MCMC(model)
mcmc.sample(20000,10000)

mcplot(mcmc.trace("errors"))

plt.figure() 

model2=pm.Model([second_dist, errors2, taus2, v2]) # since errors2 doesn't have an attribute name, I get an error
mcmc2=pm.MCMC(model2)
mcmc2.sample(20000,10000)

mcplot(mcmc2.trace('second_dist'))

【问题讨论】:

    标签: python numpy pymc


    【解决方案1】:

    PyMC2 有一些魔力,可以让我们在像errors1 这样的节点上操作,就好像它们是 numpy 数组一样,但它并不总是像你期望的那样工作。在这种情况下,您可以使用 pm.Lambda 显式定义确定性节点,​​例如

    errors2 = pm.Lambda('errors2', lambda errors1=errors1: [errors1[1],
                                                            errors1[3], 
                                                            errors1[6]])
    

    【讨论】:

    • 谢谢,但我仍然收到一条错误消息“TypeError: hasattr(): attribute name must be string”,也许是errors2,不是问题..
    • 这是一个为我运行的笔记本(模收敛问题):nbviewer.ipython.org/gist/aflaxman/452b9d8993c235743e73这对你有用吗?
    • 其实,没关系,我只是写了两个独立的程序。但你的回答回答了一切,所以我会赞成并接受。
    • 你知道如何从我的代码中输出 first_dist 和 second_dist 吗?
    • 由于观察到first_dist,所以没有踪迹。我想你可以访问first_dist.valuefirst_dist.logp
    【解决方案2】:

    只是为了澄清一些python概念,你定义errors2的方式,它是一个python列表。列表没有任何名称属性。具有列表元素的属性与整个列表(作为对象)的属性不同。 其实数组也没有name属性,如果errors1有name属性那是因为它是pymc对象,一个分布。

    我认为您必须更详细地定义errors2。是均匀分布吗?它与errors1有什么关系,不是在python中,而是在统计上?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2023-03-03
      • 1970-01-01
      • 2011-07-25
      • 2016-03-01
      相关资源
      最近更新 更多