Как организовать значения в массиве numpy в ячейки, содержащие определенный диапазон значений?

Я пытаюсь отсортировать значения в массиве numpy, чтобы я мог хранить все значения, находящиеся в определенном диапазоне (это, вероятно, можно было бы сформулировать лучше). В любом случае я приведу пример того, что я пытаюсь сделать. У меня есть массив с именем bins, который выглядит так:

bins = array([11,11.5,12,12.5,13,13.5,14])

У меня также есть другой массив под названием avgs:

avgs = array([11.02, 13.67, 11.78, 12.34, 13.24, 12.98, 11.3, 12.56, 13.95, 13.56,
              11.64, 12.45, 13.23, 13.64, 12.46, 11.01, 11.87, 12.34, 13,87, 13.04,
              12.49, 12.5])

Что я пытаюсь сделать, так это найти значения индекса массива avgs, которые находятся в диапазонах между значениями массива bins. Например, я пытался создать цикл while, который создавал бы новые переменные для каждой корзины. Первый бин будет всем, что находится между bins[0] and bins[1] и будет выглядеть так:

bin1 = array([0, 6, 15])

Эти значения индекса будут соответствовать значениям 11.02, 11.3 и 11.01 в avgs и будут значениями avgs, которые находятся между значениями индекса 0 и 1 в bins. Мне также нужны другие корзины, поэтому другим примером может быть:

bin2 = array([2, 10, 16])

Однако сложной частью этого для меня было то, что размер bins и avgs меняется в зависимости от других параметров, поэтому я пытался построить что-то, что можно было бы расширить до больших или меньших массивов bins и avgs.


person sTr8_Struggin    schedule 01.07.2013    source источник


Ответы (1)


У Numpy есть довольно мощные функции подсчета бинов.

>>> binplace = np.digitize(avgs, bins) #Returns which bin an average belongs
>>> binplace
array([1, 6, 2, 3, 5, 4, 1, 4, 6, 6, 2, 3, 5, 6, 3, 1, 2, 3, 5, 7, 5, 3, 4])

>>> np.where(binplace == 1)
(array([ 0,  6, 15]),)
>>> np.where(binplace == 2)
(array([ 2, 10, 16]),)

>>> avgs[np.where(binplace == 1)]
array([ 11.02,  11.3 ,  11.01])
person Daniel    schedule 01.07.2013
comment
Спасибо за этот отличный ответ. Я просто хочу добавить, что np.digitize() возвращает индексы, начинающиеся с 1, вместо стандартного 0. Я полагаю, что они решили реализовать этот способ, потому что ячейки являются интервалами, но это может вызвать некоторые ошибки. Просто будь осторожен!!! - person Thales Carl; 04.07.2020