numpy.histogram()
делает именно то, что вы хотите.
Сигнатура функции:
numpy.histogram(a, bins=10, range=None, normed=False, weights=None, new=None)
Нас больше всего интересуют a
и bins
. a
- это входные данные, которые необходимо связать. bins
может быть числом бинов (ваш num_bins
) или последовательностью скаляров, которые обозначают ребра бункера (наполовину открыты).
import numpy
values = numpy.arange(10, dtype=int)
bins = numpy.arange(-1, 11)
freq, bins = numpy.histogram(values, bins)
# freq is now [0 1 1 1 1 1 1 1 1 1 1]
# bins is unchanged
Цитировать документацию :
Все, кроме последнего (самого правого) бункера, полуоткрыты. Другими словами, если bins
это:
[1, 2, 3, 4]
, тогда первая ячейка равна [1, 2)
(включая 1, но исключая 2), а вторая [2, 3)
. Последний бин, однако, [3, 4]
, который включает 4.
Редактировать : Вы хотите знать индекс в ваших корзинах каждого элемента. Для этого вы можете использовать numpy.digitize()
. Если ваши корзины будут целыми, вы также можете использовать numpy.bincount()
.
>>> values = numpy.random.randint(0, 20, 10)
>>> values
array([17, 14, 9, 7, 6, 9, 19, 4, 2, 19])
>>> bins = numpy.linspace(-1, 21, 23)
>>> bins
array([ -1., 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.,
10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20.,
21.])
>>> pos = numpy.digitize(values, bins)
>>> pos
array([19, 16, 11, 9, 8, 11, 21, 6, 4, 21])
Поскольку интервал открыт по верхнему пределу, индексы верны:
>>> (bins[pos-1] == values).all()
True
>>> import sys
>>> for n in range(len(values)):
... sys.stdout.write("%g <= %g < %g\n"
... %(bins[pos[n]-1], values[n], bins[pos[n]]))
17 <= 17 < 18
14 <= 14 < 15
9 <= 9 < 10
7 <= 7 < 8
6 <= 6 < 7
9 <= 9 < 10
19 <= 19 < 20
4 <= 4 < 5
2 <= 2 < 3
19 <= 19 < 20