Работает на бинах гистограммы Python - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь найти медиану значений в пределах диапазона бина, сгенерированного функцией np.histrogram. Как бы я выбрал значения только в пределах диапазона бина и оперировал этими конкретными значениями? Ниже приведен пример моих данных и того, что я пытаюсь сделать:

x = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]

значения y могут иметь любой вид значения x, связанного с ними, например:

hist, bins = np.histogram(x)
hist = [129, 126, 94, 133, 179, 206, 142, 147, 90, 185] 
bins = [0.,         0.09999926, 0.19999853, 0.29999779, 0.39999706,
        0.49999632, 0.59999559, 0.69999485, 0.79999412, 0.8999933,
        0.99999265]

Итак, я пытаюсь найти среднее значение y 129 значений в первом сгенерированном бине и т. Д.

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

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

x = np.random.rand(1000)
hist,bins = np.histogram(x)

ix = [0] + hist.cumsum().tolist()
# if don't mind sorting your original data, use x.sort() instead
xsorted = np.sort(x)
ix = [0] + hist.cumsum()
[np.median(x[i:j]) for i,j in zip(ix[:-1], ix[1:])]

, который выведет медианы в виде стандартного списка Python.

0 голосов
/ 14 ноября 2018

np.digitize и np.searchsorted будут сопоставлять ваши данные с ячейками. Последнее предпочтительнее в этой ситуации, потому что оно делает меньше ненужных проверок (ваши корзины можно с уверенностью считать отсортированными).

Если вы посмотрите документацию np.histogram (раздел «Примечания»), вы заметите, что все лотки справа наполовину открыты (кроме последнего). Это означает, что вы можете сделать следующее:

x = np.abs(np.random.normal(loc=0.75, scale=0.75, size=10000))
h, b = np.histogram(x)
ind = np.searchsorted(b, x, side='right')

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

m = [np.median(x[ind == label]) for label in range(b.size - 1)]

Если вам удастся отсортировать входные данные, ваша работа станет проще, потому что вы можете использовать представления вместо извлечения данных для каждой ячейки с помощью маскирования. np.split - хороший выбор в этом случае:

x.sort()
sections = np.split(x, np.cumsum(h[:-1]))
m = [np.median(arr) for arr in sections]
0 голосов
/ 14 ноября 2018

В одну сторону можно использовать pandas.cut():

>>> import pandas as pd
>>> import numpy as np
>>> np.random.seed(444)

>>> x = np.random.randint(0, 25, size=100)
>>> _, bins = np.histogram(x)
>>> pd.Series(x).groupby(pd.cut(x, bins)).median()
(0.0, 2.4]       2.0
(2.4, 4.8]       3.0
(4.8, 7.2]       6.0
(7.2, 9.6]       8.5
(9.6, 12.0]     10.5
(12.0, 14.4]    13.0
(14.4, 16.8]    15.5
(16.8, 19.2]    18.0
(19.2, 21.6]    20.5
(21.6, 24.0]    23.0
dtype: float64

Если вы хотите остаться в NumPy, вы можете проверить np.digitize().

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