如何向数组添加属性名称?

时间:2015-07-07 16:44:14

标签: python numpy pymc

我想知道如何将属性添加到数组中。

当我这样做时

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

名称'错误'已添加。

但是当我做的时候

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

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

这是我的完整代码:

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'))

2 个答案:

答案 0 :(得分:1)

PyMC2有一些神奇之处可以让我们在像errors1这样的节点上运行,就像它们是numpy数组一样,但它并不像你期望的那样工作。在这种情况下,您可以使用pm.Lambda明确定义确定性节点,​​例如

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

答案 1 :(得分:0)

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

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