Python: частота появления

У меня есть список целых чисел и вы хотите получить частоту каждого целого числа. Об этом говорилось здесь

Проблема заключается в том, что подход, который я использую, дает мне частоту плавающих чисел, когда мой набор данных состоит только из целых чисел. Почему это происходит и как я могу получить частоту целых чисел из моих данных?

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

import numpy as np
import matplotlib.pyplot as plt
from numpy import *
data = loadtxt('data.txt',dtype=int,usecols=(4,)) #loading 5th column of csv file into array named data. 
plt.hist(data) #plotting the column as histogram 

Я получаю гистограмму, но я заметил, что если я "распечатаю" историю (данные)

hist=np.histogram(data)
print hist(data)

Я получаю это:

(array([ 2323, 16338,  1587,   212,    26,    14,     3,     2,     2,     2]), 
array([  1. ,   2.8,   4.6,   6.4,   8.2,  10. ,  11.8,  13.6,  15.4,
    17.2,  19. ]))

Где второй массив представляет значения, а первый массив представляет число вхождений.

В моем наборе данных все значения являются целыми числами, как происходит, что второй массив имеет плавающие числа и как мне получить частоту целых чисел?

ОБНОВЛЕНИЕ:

Это решает проблему, спасибо Лев за ответ.

plt.hist(data, bins=np.arange(data.min(), data.max()+1))

Чтобы избежать создания нового вопроса, как я могу построить столбцы "посередине" для каждого целого числа? Скажем, я хочу, чтобы столбец для целого числа 3 занимал пространство между 2.5 и 3.5 не между 3 и 4.

histogram

Ответ 1

Если вы не укажете, какие ящики использовать, np.histogram и pyplot.hist будут использовать настройку по умолчанию, которая должна использовать 10 одинаковых бункеров. Левая граница 1-го бункера является наименьшим значением, а правая граница последнего бина является самой большой.

Вот почему границы бинов являются числами с плавающей запятой. Вы можете использовать аргументы ключевого слова bins для обеспечения другого выбора бункеров, например:

plt.hist(data, bins=np.arange(data.min(), data.max()+1))

Изменить: Самый простой способ переместить все ящики влево, вероятно, просто для того, чтобы вычесть 0,5 из всех границ бинов:

plt.hist(data, bins=np.arange(data.min(), data.max()+1)-0.5)

Другой способ достижения такого же эффекта (не эквивалент, если присутствуют нецелые):

plt.hist(data, bins=np.arange(data.min(), data.max()+1), align='left')

Ответ 3

(Поздно на вечеринку, просто думал, что я добавлю реализацию seaborn)

Seaborn Реализация вышеуказанного вопроса:

seaborn.__version__ = 0.9.0 на момент написания.

Загрузите библиотеки и настройте макетные данные.

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

data = np.array([3]*10 + [5]*20 + [7]*5 + [9]*27 + [11]*2)

seaborn.distplot данные, используя seaborn.distplot:

Используя указанные бункеры, рассчитывается в соответствии с вышеуказанным вопросом.

sns.distplot(data,bins=np.arange(data.min(), data.max()+1),kde=False,hist_kws={"align" : "left"})
plt.show()

Попробовать numpy встроенные методы биннинга

Я использовал метод doane ниже, который генерировал целочисленные бины, поэтому стоит попробовать стандартные методы numpy.histogram_bin_edges из numpy.histogram_bin_edges как именно так matplotlib.hist() данные.

sns.distplot(data,bins="doane",kde=False,hist_kws={"align" : "left"})
plt.show()

Создает следующую гистограмму:

enter image description here