Построить гистограмму - PullRequest
       31

Построить гистограмму

1 голос
/ 17 августа 2011

Я пытаюсь составить гистограмму с помощью python.Я начинаю со следующего фрагмента:

def histogram(L):
    d = {}
    for x in L:
        if x in d:
            d[x] += 1
        else:
            d[x] = 1
    return d

Я понимаю, что он использует функцию словаря для решения проблемы.Но я просто запутался в 4-й строке: if x in d:

d должно быть построено, в d пока ничего нет, так что, если x в d?

Ответы [ 7 ]

5 голосов
/ 17 августа 2011

Имейте в виду, что if находится внутри for цикла.

Итак, когда вы смотрите на самый первый элемент в L, в d ничего нет, но когда вы переходите к следующему элементу в L, означает что-то в d, поэтому вам необходимо проверить, нужно ли создать новый бин на гистограмме (d[x] = 1) или добавить элемент в существующий бин (d[x] += 1).

В Python у нас есть несколько ярлыков для этого:

from collections import defaultdict

def histogram(L):
    d = defaultdict(int)
    for x in L:
        d[x] += 1
return d

Это автоматически запускает каждую ячейку в d с нуля (что возвращает int()), поэтому вам не нужно проверять, существует ли ячейка. На Python 2.7 или выше:

from collections import Counter

d = Counter(L)

Будет автоматически отображаться частота каждого элемента в L. Никакого другого кода не требуется.

2 голосов
/ 20 июля 2013

Вы можете создать гистограмму с пониманием dict:

histogram = {key: l.count(key) for key in set(L)}
2 голосов
/ 17 августа 2011

Код внутри цикла for будет выполнен один раз для каждого элемента в L, где x - значение текущего элемента.

Давайте рассмотрим простой случай, когда L это список [3, 3].В первый раз в цикле d будет пустым, x будет 3, а 3 in d будет ложным, поэтому d[3] будет установлен в 1. В следующий раз в цикле x будет 3снова, и 3 in d будет истинным, поэтому d[3] будет увеличен на 1.

1 голос
/ 10 сентября 2015

Вы можете использовать Counter, доступный в Python 2.7 и Python 3.1 +.

>>> # init empty counter
>>> from collections import Counter
>>> c = Counter()

>>> # add a single sample to the histogram
>>> c.update([4])
>>> # add several samples at once
>>> c.update([4, 2, 2, 5])

>>> # print content
>>> print c

Counter({2: 2, 4: 2, 5: 1})

Модуль имеет несколько полезных функций, таких как сложение, вычитание, пересечение и объединение на счетчиках. Counter может считать все, что может быть использовано в качестве словарного ключа.

1 голос
/ 17 августа 2011

Я думаю, что другие парни объяснили вам, почему if x in d.Но вот подсказка, как этот код должен быть написан после «не спрашивай разрешения, попроси прощения»:

    ...
    try:
        d[x] += 1
    except KeyError:
        d[x] = 1

Причина этого в том, что вы ожидаете, что эта ошибка появится только один раз (приминимум один раз за вызов метода).Таким образом, нет необходимости проверять, если x in d.

0 голосов
/ 17 мая 2013

Вы можете создать свою собственную гистограмму в Python, используя, например, matplotlib.Если вы хотите увидеть один пример того, как это можно реализовать, вы можете обратиться к этому ответу .

enter image description here

В этом конкретном случае вы можете использоватьделать:

temperature = [4,   3,   1,   4,   6,   7,   8,   3,   1]
radius      = [0,   2,   3,   4,   0,   1,   2,  10,   7]
density     = [1,  10,   2,  24,   7,  10,  21, 102, 203]

points, sub = hist3d_bubble(temperature, density, radius, bins=4)
sub.axes.set_xlabel('temperature')
sub.axes.set_ylabel('density')
sub.axes.set_zlabel('radius')
0 голосов
/ 17 августа 2011

если x не в d, то оно помещается в d с d [x] = 1. Обычно, если x появляется в d более одного раза, это увеличивает число, совпадающее с x.

Попробуйте использовать это для перехода по коду: http://people.csail.mit.edu/pgbovine/python/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...