首页 > 解决方案 > 从python中的联合分布制作边际分布

问题描述

我有 3 个 X 值、Y 值和概率数组。我正在尝试做两件事,但它们实际上与我想象的编码方式相同。

我想找到所有相同的 X 值,并将相应的概率加到另一个数组中。(所以如果我的 X 值为 [3,7,4,7] 并且我的概率是 [.2,.3,.1,.4] 我想将 .3 和 .4 加在一起。我正在尝试用一个循环来做这个,但因为我两周前才拿起python,所以我很挣扎。

我想尝试的思考过程:

MargX=np.unique(X array)
MargXp=np.zeros(len(MargX))

for Ind in range(len(MargX):
    ?

(这里我想取我的 X 数组中相等的值,从我的 p 数组中获取相应的值,然后将它们添加到我的零数组 MargXp 中)

我尝试了几种不同的方法来设置我的循环,以便它将值添加到我制作的零数组中,但无济于事,因为我不断收到语法错误和其他各种错误。

标签: pythonarraysdistribution

解决方案


如果您尝试将 X 压缩为unique,那么找到相应的概率将涉及在 X 数组中搜索索引并使用这些索引来找到相应的概率。我认为您会更乐意使用 python 的字典概念将键(x 值)与值(概率)相关联。Usingdefaultdict允许您为字典中尚未包含的键指定默认值。在这种情况下,从任意 x 值的概率为零的想法开始。当您遍历 x/概率对时,您可以使用增量将概率添加到与 x 关联的存储值或默认值。

结果如下所示:

from collections import defaultdict

# synchronized arrays from your example.
x = [3, 7, 4, 7]
probs = [0.2, 0.3, 0.1, 0.4]

marginal = defaultdict(lambda: 0.0) # 0.0 is the default value
for key, value in zip(x, probs):    # zip combines the arrays as pairs
    marginal[key] += value          # increment to accumulate total probability

# The following line is not strictly needed since all values are
# in the dictionary, but by default key values are not ordered.
orderedkeys = sorted(marginal.keys())

for key in orderedkeys:
    print(key, marginal[key])

产生:

3 0.2
4 0.1
7 0.7

推荐阅读