Извлечение данных из гистограммы с помощью пользовательских ячеек в Python

#python #numpy #dataset #histogram #binning

Вопрос:

У меня есть набор данных о расстояниях между двумя частицами, и я хочу поместить эти данные в пользовательские ячейки. Например, я хочу посмотреть, сколько значений расстояния лежит в интервале от 1 до 2 микрометров и так далее. Я написал код об этом, и, похоже, он работает. Это мой код для этой части:

 #Custom binning of data

bins= [0,1,2,3,4,5,6,7,8,9,10]
fig, ax = plt.subplots(n,m,figsize = (30,10)) #using this because I actually have 5 histograms, but only posted one here
ax.hist(dist_from_spacer1, bins=bins, edgecolor="k")
ax.set_xlabel('Distance from spacer 1 [µm]')
ax.set_ylabel('counts')
plt.xticks(bins)
plt.show()

 

Однако теперь я хочу извлечь эти значения данных из интервалов и сохранить их в списках. Я пытался использовать:

 np.histogram(dist_from_spacer1, bins=bins)
 

Однако это просто показывает, сколько точек данных находится в каждой ячейке и интервалы ячеек, точно так же, как это:

 (array([  0,   0,  44, 567, 481, 279, 309, 202, 117,   0]),
 array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]))
 

Как я могу получить точные данные, относящиеся к каждой ячейке гистограммы?

Комментарии:

1. Что ж, если вам нужны значения в dist_from_spacer1 каждой ячейке, то они у вас уже есть в компактном представлении… В вашем примере значение 3 найдено 44, поэтому ячейка содержит список значений [3, 3, 3, 3, …, 3] 44-го размера. Я что-то пропустил? Вам нужны индексы вместо этого?

Ответ №1:

Да, np.histogram вычисляет, что вам нужно для гистограммы, и, следовательно, конкретные точки данных не нужны, просто границы ячеек и подсчет для каждой ячейки. Однако границ ячеек достаточно, чтобы получить то, что вы хотите, используя np.digitizr

 counts, bins = np.histogram(dist_from_spacer1)
indices = np.digitize(dist_from_spacer1, bins)
lists = [[] for _ in range(len(bins))]
[lists[i].append(x) for i, x in zip(indices, dist_from_spacer1)
 

В вашем случае границы ячеек предопределены заранее, поэтому вы можете использовать np.digitize их напрямую