scipy.stats.binned_statistic_dd () нумерация бинов имеет много дополнительных бинов - PullRequest
0 голосов
/ 20 марта 2020

Я изо всех сил пытаюсь иметь дело с результатом scipy.stats.binned_statistic_dd (). У меня есть массив позиций и другой массив идентификаторов, которые я биннинг в 3 направлениях. В качестве входных данных я предоставляю список ребер лотка, а не количество лотков в каждом направлении в сочетании с параметром диапазона. У меня есть 3 контейнера по x, 2 по y и 3 по z или 18.

Однако, когда я проверяю перечисленные номера бин, все они находятся в диапазоне, превышающем 20. Как получить номера бинов, чтобы они отражали количество предоставленных бинов, и избавились от всех дополнительных бинов?

Я пытался следовать тому, что было предложено в этом посте ( Вывод в scipy.stats.binned_statistic_dd () ), который имеет дело с чем-то похожим, но я не могу понять, как это применить к мое дело. Как обычно, документация такая же криптовая c, как и всегда.

В этом примере будет очень полезна любая помощь по получению моих чисел между 1-18 в этом примере!

pos = np.array([[-0.02042167, -0.0223282 ,  0.00123734],
       [-0.0420364 ,  0.01196078,  0.00694259],
       [-0.09625651, -0.00311446,  0.06125461],
       [-0.07693234, -0.02749618,  0.03617278],
       [-0.07578646,  0.01199925,  0.02991888],
       [-0.03258293, -0.00371765,  0.04245596],
       [-0.06765955,  0.02798434,  0.07075846],
       [-0.02431445,  0.02774102,  0.06719837],
       [ 0.02798265, -0.01096739, -0.01658691],
       [-0.00584252,  0.02043389, -0.00827088],
       [ 0.00623063, -0.02642285,  0.03232817],
       [ 0.00884222,  0.01498996,  0.02912483],
       [ 0.07189474, -0.01541584,  0.01916607],
       [ 0.07239394,  0.0059483 ,  0.0740187 ],
       [-0.08519159, -0.02894125,  0.10923724],
       [-0.10803509,  0.01365444,  0.09555333],
       [-0.0442866 , -0.00845725,  0.10361843],
       [-0.04246779,  0.00396127,  0.1418258 ],
       [-0.08975861,  0.02999023,  0.12713186],
       [ 0.01772454, -0.0020405 ,  0.08824418]])

ids = np.array([16,  9,  6, 19,  1,  4, 10,  5, 18, 11,  2, 12, 13,  8,  3, 17, 14,
       15, 20,  7])

xbinEdges = np.array([-0.15298488, -0.05108961,  0.05080566,  0.15270093])
ybinEdges = np.array([-0.051,  0.   ,  0.051])
zbinEdges = np.array([-0.053,  0.049,  0.151,  0.253])

ret = stats.binned_statistic_dd(pos, ids, bins=[xbinEdges, ybinEdges, zbinEdges],
                                statistic='count', expand_binnumbers=False)
bincounts = ret.statistic
binnumber = ret.binnumber.T

>>> binnumber  = array([46, 51, 27, 26, 31, 46, 32, 52, 46, 51, 46, 51, 66, 72, 27, 32, 47,
       52, 32, 47], dtype=int64)

ranges = [[-0.15298488071, 0.15270092971],
 [-0.051000000000000004, 0.051000000000000004],
 [-0.0530000000000001, 0.25300000000000006]]

ret3 = stats.binned_statistic_dd(pos, ids, bins=(3,2,3), statistic='count', expand_binnumbers=False, range=ranges)
bincounts = ret3.statistic
binnumber = ret3.binnumber.T

>>> binnumber  = array([46, 51, 27, 26, 31, 46, 32, 52, 46, 51, 46, 51, 66, 72, 27, 32, 47,
       52, 32, 47], dtype=int64)

1 Ответ

0 голосов
/ 23 марта 2020

Хорошо, после нескольких дней фонового мышления и быстрого изучения исходного кода binned_statistic_dd () я думаю, что пришел к правильному ответу, и он довольно прост.

Кажется, что binned_statistic_dd () добавляет дополнительный набор бинов выброса в фазе биннинга, а затем удаляет их при возврате результатов гистограммы, но оставляя номера бинов нетронутыми (я думаю, это в случае, если вы хотите повторно использовать результат для дальнейших выходов статистики).

Таким образом, кажется, что если вы экспортируете расширенные номера бинов (expand_binnumbers=True), а затем вычитаете 1 из каждого номера бинов для повторной настройки индексов бинов, вы можете вычислить «правильные» идентификаторы бинов.

ret2 = stats.binned_statistic_dd(pos, ids, bins=[xbinEdges, ybinEdges, zbinEdges],
                                statistic='count', expand_binnumbers=True)
bincounts2 = ret2.statistic
binnumber2 = ret2.binnumber
indxnum2 = binnumber2-1
corrected_bin_ids = np.ravel_multi_index((indxnum2),(numX, numY, numZ))

Быстрый и просто в конце!

...