字典值的平均值,其中值的形式为 list/array。 (一班)
Mean of dictionary's values, where values are in the form of a list/array. (one liner)
背景:
不确定我的术语是否正确,所以如果这恰好是一个重复的问题,我深表歉意(similar question 1, . I've been reading this tutorial How to Iterate Through a Dictionary in Python我想我想做的是"Doing Some Calculations: Revisited" , 但以 "tuple unpacking" 的形式(第 3 个 link 中使用的单词)。
Problem/Goal:
我希望的是用原始键创建一个新字典,一个新值是旧值列表的平均值并绘制它。
我的尝试:
下面是作为 for 循环的完整尝试,也是我尝试进行 "one liner" 的尝试。我得到的最接近的是形成两个接受字典键的不同变量和另一个接受值并将它们绘制为 (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()
问题
如果可能的话,我将如何把它写成一行或者什么是最 efficient/fastest 的方式来做到这一点。
另外,将此称为 vectorized/broadcast 计算是否正确?如果可能的话,有人可以解释我如何 vectorize/broadcast 这些代码行吗? (也不确定这是否是正确的术语,甚至不确定是否适用于这种情况)。除了标准 scipy tutorial and also tutorialspoint 之外,我还没有找到关于这些概念的可靠教程。
这可以写成一行,但我不推荐:
>>> 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, '.')
这些都不是vertorised或广播计算。这些术语指的是可以在不使用 for 循环的情况下对数据执行批处理操作的位置,并且在 Python 的 C 扩展中很常见,例如对 Numpy 的数组和 Pandas' 数据帧执行的操作。由于我们这里的数据结构是一个字典,我们不能在不转换为这些结构之一的情况下在这里应用矢量化。
我们在这里采用的方法是使用列表理解和生成器表达式,这基本上是一种缩小和组合 for 循环和 lambda 函数的方法。您可以阅读有关这些 的更多信息。请注意,这些与广播之间的区别 operations/vectorisation 是列表理解遍历结构并一次对一个数据应用操作。
背景:
不确定我的术语是否正确,所以如果这恰好是一个重复的问题,我深表歉意(similar question 1,
Problem/Goal:
我希望的是用原始键创建一个新字典,一个新值是旧值列表的平均值并绘制它。
我的尝试:
下面是作为 for 循环的完整尝试,也是我尝试进行 "one liner" 的尝试。我得到的最接近的是形成两个接受字典键的不同变量和另一个接受值并将它们绘制为 (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()
问题
如果可能的话,我将如何把它写成一行或者什么是最 efficient/fastest 的方式来做到这一点。
另外,将此称为 vectorized/broadcast 计算是否正确?如果可能的话,有人可以解释我如何 vectorize/broadcast 这些代码行吗? (也不确定这是否是正确的术语,甚至不确定是否适用于这种情况)。除了标准 scipy tutorial and also tutorialspoint 之外,我还没有找到关于这些概念的可靠教程。
这可以写成一行,但我不推荐:
>>> 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, '.')
这些都不是vertorised或广播计算。这些术语指的是可以在不使用 for 循环的情况下对数据执行批处理操作的位置,并且在 Python 的 C 扩展中很常见,例如对 Numpy 的数组和 Pandas' 数据帧执行的操作。由于我们这里的数据结构是一个字典,我们不能在不转换为这些结构之一的情况下在这里应用矢量化。
我们在这里采用的方法是使用列表理解和生成器表达式,这基本上是一种缩小和组合 for 循环和 lambda 函数的方法。您可以阅读有关这些