Я намерен переписать код ниже из-за проблем с читабельностью Сабольча.До тех пор знайте, что если ваши лотки являются регулярными и вы можете использовать Round
, Floor
или Ceiling
(со вторым аргументом) вместо Nearest
, приведенный ниже код будет намного быстрее.В моей системе тестирование выполняется быстрее, чем было опубликовано решение GatherBy
.
Если я понимаю ваши требования, я предлагаю:
data = RandomReal[100, {75, 3}];
bins = {0, 20, 40, 60, 80, 100};
Reap[
Sow[{#3, #2}, bins ~Nearest~ #] & @@@ data,
bins,
Reap[Sow[#, bins ~Nearest~ #2] & @@@ #2, bins, Tr@#2 &][[2]] &
][[2]] ~Flatten~ 1 ~Total~ {3} // MatrixForm
Рефакторинг:
f[bins_] := Reap[Sow[{##2}, bins ~Nearest~ #]& @@@ #, bins, #2][[2]] &
bin2D[data_, X_, Y_] := f[X][data, f[Y][#2, #2~Total~2 &] &] ~Flatten~ 1 ~Total~ {3}
Использование:
bin2D[data, xbins, ybins]