Получить отображение от каждого элемента ввода в корзину гистограммы в Джулии - PullRequest
0 голосов
/ 26 февраля 2019

Matlab's [n,mapx] = histc(x, bin_edged) возвращает количество x в каждом бине как n и возвращает карту, которая имеет ту же длину x, которая является индексом бина, в который был помещен каждый элемент x.

Я могу сделать то же самое в Джулии следующим образом:

Using StatsBase
x = rand(1000)
bin_e = 0:0.1:1
h = fit(Histogram, x, bin_e)
yx = map((z) -> findnext(z.<=h.edges[1],1),x) .- 1

Является ли это "правильным способом" сделать это?Это выглядит немного глупо.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

После просмотра кода для Histogram.jl я обнаружил, что в них уже включена функция binindex.Так что это решение, вероятно, лучшее:

x = 0:0.001:10
h1 = fit(Histogram,x,0:10,closed=left)
xmap1 = StatsBase.binindex.(Ref(h1), x)
h2 = fit(Histogram,x,0:10,closed=right)
xmap2 = StatsBase.binindex.(Ref(h2), x)
0 голосов
/ 26 февраля 2019

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

binindices(edges, data) = searchsortedlast.(Ref(edges), data)

Обратите внимание, что края корзины сортируются имы можем использовать seachsortedlast, чтобы получить последний край бина, меньший или равный точке данных.Передавая это по всем данным, мы получаем отображение.Обратите внимание, что Ref(edges) указывает, что edges является скаляром при широковещании (это означает, что полный массив учитывается при каждом вызове).

Хотя этот подход концептуально идентичен вашему решению, этот подход примерно в 13 раз быстреемоя машина.

Я подал проблему на StatsBase.jl's github page , предлагая добавить это как функцию.

...