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')
Ответ 2
Вы можете использовать groupby
из itertools
, как обсуждалось в Как подсчитать частоту элементов в списке?:
import numpy sa np
from itertools import groupby
freq = {key:len(list(group)) for key, group in groupby(np.sort(data))}
Ответ 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)
Используя указанные бункеры, рассчитывается в соответствии с вышеуказанным вопросом.
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]()