Среднее значение словаря, где значения представлены в виде списка / массива. (один лайнер) - PullRequest
1 голос
/ 27 января 2020

Справочная информация:

Не уверен, что у меня есть вся моя терминология, поэтому прошу прощения, если это дублирующий вопрос (аналогичный вопрос 1 , аналогичный вопрос 2) . Я читал этот урок Как перебирать словарь в Python, и я думаю, что я хочу сделать что-то вроде «Выполнение некоторых вычислений: пересмотр», но в форме «распаковка кортежа» (слова, использованные в 3-ей ссылке).

Задача / цель:

Я надеялся создать новый словарь с оригинальным ключом , новое значение, которое является средним из списка старого значения и построить его.

Моя попытка:

Ниже приведена полная попытка как для l oop, а также моя попытка сделать "один лайнер". Самое близкое, что я получил, это формирование двух разных переменных, которые принимают ключи словарей, и еще одну переменную, которая принимает значения и отображает их как (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()

Вопросы

  1. Если возможно, как бы я написал это одной строкой или какой самый эффективный / быстрый способ сделать это.

  2. Также было бы правильно назвать это векторизованным / широковещательным расчетом? Если это возможно, может кто-нибудь объяснить, как я бы векторизовал / транслировал эти строки кода? (также не уверен, что это правильная терминология или даже применимо в этом сценарии). Я еще не нашел учебник solid по этим понятиям, кроме стандартного учебника scipy , а также tutorialspoint .

1 Ответ

1 голос
/ 30 января 2020

Это можно записать в одну строку, но я бы не советовал:

>>> 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, и являются общими в C расширениях Python, таких как операции, выполняемые с массивами Numpy и Pandas 'кадрами данных. Поскольку наша структура данных здесь представляет собой словарь, мы не можем применить здесь векторизацию без преобразования в одну из этих структур.

Подход, который мы здесь использовали, заключается в использовании списочных представлений и выражений-генераторов, которые в основном являются способ минимизации и объединения for-циклов и лямбда-функций. Вы можете прочитать больше об этих здесь . Обратите внимание, что различие между этими и широковещательными операциями / векторизацией заключается в том, что списки выполняют итерацию по структуре и применяют операции к одному фрагменту данных за раз.

...