Matlab's [n,mapx] = histc(x, bin_edged) zwraca liczniki X w każdym pojemniku jako n i zwraca mapę, która jest taką samą długość x, która jest indeksiem bin, który każdy element x został umieszczony.

Mogę zrobić to samo w Julii w następujący sposób:

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

Czy to "właściwy sposób"? Wygląda na nieco Kludgy.

2
jerlich 26 luty 2019, 09:12

2 odpowiedzi

Najlepsza odpowiedź

Po przejrzeniu kodu na histogramie.jl odkryłem, że zawierałem już funkcję binindex. Więc to rozwiązanie jest prawdopodobnie najlepsze:

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)
1
jerlich 27 luty 2019, 06:37

Inspirowany To pytanie Python ty powinien być w stanie zdefiniować małą funkcję, która zapewnia żądane mapowanie (konwencje modulo):

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

Zauważ, że krawędzie bin są sortowane i możemy użyć seachsortedlast, aby uzyskać ostatni krawędź bin mniejszy lub równy niż datapoint. Nadawanie tego przez wszystkie dane otrzymujemy mapowanie. Należy pamiętać, że Ref(edges) wskazuje, że edges jest skalarnym podawaniem (oznacza to, że pełna tablica jest rozpatrywana w każdym połączeniu).

Chociaż koncepcyjnie identyczny z twoim rozwiązaniem, podejście to około 13x szybsze na mojej maszynie.

Złożyłem problem na temat Strona Github Statsbase.jl sugeruje, aby dodać to jako cecha.

4
crstnbr 26 luty 2019, 07:49