【问题标题】:Extracting values stored in a 2D array of dictionaries with Python使用 Python 提取存储在二维字典数组中的值
【发布时间】:2018-05-19 06:03:14
【问题描述】:

我写了一段代码来确定当 X 骰子被掷出时得到 Y 值的概率。我使用的等式包含从 0 到 Y 的总和。

我想在网格上绘制值(骰子数 - 值的总和)并创建了一个网格。

import scipy.special
from matplotlib import pyplot as plt
from matplotlib import cm as cm
import numpy as np
from numpy import exp,arange

def probability_of_sum(sum, dice, faces):
    # Give different names.
    X = sum
    Y = dice
    Z = faces

    # Calculations, calculations, calculations.
    # Dummy values.
    wanted_possibilities = 1
    total_possibilities = 2
    probability = wanted_possibilities/total_possibilities

    return {'wanted_possibilities':wanted_possibilities, 'total_possibilities':total_possibilities, 'probability':probability}


# Main part of the function.
# Consider 1 to 8 dice
# Get probabilities for lowest possible sum (8) to highest possible sum (48)

dice_range = np.linspace(1, 8, num=8)
value_range = np.linspace(1, 8*6, num=8*6)
X,Y = np.meshgrid( dice_range, value_range)

# Calculate value for each grid point separately using VECTORIZE.
value_prob = np.vectorize(probability_of_sum)( Y, X, 6)

我的函数的输出现在是一个二维字典数组(下面是虚拟值):

[[{'Wanted_possibilities': 0, 'total_possibilities':1, 'probability':0}
{'Wanted_possibilities': 1, 'total_possibilities':1, 'probability':1}]
 [{'Wanted_possibilities': 0, 'total_possibilities':2, 'probability':0}
{'Wanted_possibilities': 1, 'total_possibilities':2, 'probability':0.5}]
 [{'Wanted_possibilities': 0, 'total_possibilities':3, 'probability':0}
{'Wanted_possibilities': 1, 'total_possibilities':3, 'probability':0.33}]
 [{'Wanted_possibilities': 0, 'total_possibilities':4, 'probability':0}
{'Wanted_possibilities': 1, 'total_possibilities':4, 'probability':0.25}] ]

如何从这里继续将输出(“概率”)绘制为 X 和 Y 的二维函数?

value_prob['probability']

给我错误

IndexError:只有整数、切片 (:)、省略号 (...)、numpy.newaxis(None) 以及整数或布尔数组是有效的索引。

我可以使用

访问单个元素
(value_prob[1,1])['probability']

但是我需要一个循环来绘制函数。是否有更通用/强大/更清洁的访问方式?

编辑:我想针对(骰子,值)绘制“概率”。

【问题讨论】:

  • 您为什么使用字典来表示您的数据?您可以将值添加到二维数组中。
  • 您的x-y 值标头是什么?概率和总可能性,还是想要的可能性和总可能性?
  • @O.Suleiman - 我选择使用字典来明确区分“probability_of_sum”函数产生的值。您将如何将值添加到数组中?
  • @Ajax1234 - 2D 图将具有 x = 'dice'、y = 'value'(用于构造网格的值)和 z = 结果中的三个值中的任何一个。让我们说“概率”。
  • @AVS 我的意思是您可以将值直接添加到数组数组中,并通过数组中的索引指示该值代表什么。

标签: python arrays numpy dictionary for-loop


【解决方案1】:

你可以试试这个:

import matplotlib.pyplot as plt
import itertools
import numpy as np
s = [[{'Wanted_possibilities': 0, 'total_possibilities':1, 'probability':0},
{'Wanted_possibilities': 1, 'total_possibilities':1, 'probability':1}],
 [{'Wanted_possibilities': 0, 'total_possibilities':2, 'probability':0},
{'Wanted_possibilities': 1, 'total_possibilities':2, 'probability':0.5}],
 [{'Wanted_possibilities': 0, 'total_possibilities':3, 'probability':0},
{'Wanted_possibilities': 1, 'total_possibilities':3, 'probability':0.33}],
 [{'Wanted_possibilities': 0, 'total_possibilities':4, 'probability':0},
{'Wanted_possibilities': 1, 'total_possibilities':4, 'probability':0.25}] ]
final_data = list(itertools.chain(*[[[i['Wanted_possibilities'], i['total_possibilities'], i['probability']] for i in b] for b in s]))
plt.bar(np.arange(len([i[-1] for i in final_data])), [i[0] for i in final_data], 0.60, yerr = [i[1] for i in final_data])
plt.ylabel('Probabilities')
plt.xticks(np.arange(len([i[-1] for i in final_data])), tuple(map(str, [i[-1] for i in final_data])))
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多