背景:

不知道我的术语是否正确,因此,如果这恰巧是重复的问题(similar question 1similar question 2),我深表歉意。我一直在阅读本教程How to Iterate Through a Dictionary in Python,我想我想做的事情与“做一些计算:再访”类似,但形式为“元组拆包”(第3链接中使用的单词)。

问题/目标:

我希望的是用原始键创建一个新字典,将新值作为旧值列表的平均值,然后绘制它。

我的尝试:

以下是作为for循环的完整尝试,也是我尝试制造“一个衬纸”的尝试。我得到的最接近的结果是形成两个使用字典键的变量,以及另一个使用值并将其绘制为(x,y)的变量。

k_to_accuracies = {1: [0.274, 0.274, 0.274, 0.274, 0.274],
                   2: [0.224, 0.224, 0.224, 0.224, 0.224],
                   3: [0.272, 0.272, 0.272, 0.272, 0.272],
                   5: [0.278, 0.278, 0.278, 0.278, 0.278],
                   7: [0.274, 0.274, 0.274, 0.274, 0.274],
                   10: [0.282, 0.282, 0.282, 0.282, 0.282],
                   15: [0.272, 0.272, 0.272, 0.272, 0.272],
                   20: [0.272, 0.272, 0.272, 0.272, 0.272],
                   25: [0.274, 0.274, 0.274, 0.274, 0.274],
                   30: [0.254, 0.254, 0.254, 0.254, 0.254]}
k_ave = {}
for key, value in k_to_accuracies.items():
    #print(key, '->', value)
    k_ave[key] = np.mean(value)
    print(k_ave)

k_ave = {}
k_ave = [np.mean(value) for value in k_to_accuracies.values()]
print("\n",k_ave)

k_keys = [key for key in k_to_accuracies.keys()]
print("\n",k_keys)

plt.plot(k_keys, k_ave, '.')
plt.show()


问题


如果可能的话,我将如何写成一行,或者最有效/最快的方法是什么。
将其称为向量化/广播计算也正确吗?如果有可能的话,有人可以解释我将如何对这些代码行进行矢量化/广播? (也不确定这是否是正确的术语,甚至在这种情况下是否适用)。除了标准scipy tutorialtutorialspoint之外,我还没有找到关于这些概念的扎实教程。

最佳答案

可以写成一行,但我不建议这样做:

>>> plt.plot(*zip(*{k: np.mean(v) for k, v in k_to_accuracies.items()}.items()), '.')


如您所见,这是相当不透明的,尽管它产生正确的输入,但问题中的版本却更容易阅读和理解。在时间比较方面,这种方法与您所质疑的方法之间几乎没有区别:

k_ave = [np.mean(value) for value in k_to_accuracies.values()]
k_keys = [key for key in k_to_accuracies.keys()]
plt.plot(k_keys, k_ave, '.')


这些都不是经过验证或广播的计算。这些术语指的是可以在不使用for循环的情况下对数据执行批处理操作的地方,并且在Python的C扩展中很常见,例如在Numpy的数组和Pandas的数据帧上执行的操作。由于此处的数据结构是字典,因此如果不转换为这些结构之一,就无法在此处应用矢量化。

我们在这里采用的方法是使用列表理解和生成器表达式,它们基本上是最小化和组合for循环和lambda函数的一种方式。您可以阅读有关这些here的更多信息。请注意,这些操作与广播操作/矢量化之间的区别在于,列表解析会遍历一种结构,并一次对一个数据应用操作。

关于python - 字典值的平均值,其中值采用列表/数组的形式。 (一根类轮),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59928765/

10-11 22:35
查看更多