numpy.digitize#

numpy.digitize(x, bins, правый=False)[источник]#

Возвращает индексы бинов, к которым принадлежит каждое значение во входном массиве.

правый

порядок бинов

возвращённый индекс i удовлетворяет

False

увеличивая

bins[i-1] <= x < bins[i]

True

увеличивая

bins[i-1] < x <= bins[i]

False

убывающий

bins[i-1] > x >= bins[i]

True

убывающий

bins[i-1] >= x > bins[i]

Если значения в x выходят за границы bins, 0 или len(bins) возвращается в зависимости от ситуации.

Параметры:
xarray_like

Входной массив для бинирования. До NumPy 1.10.0 этот массив должен был быть одномерным, но теперь может иметь любую форму.

binsarray_like

Массив бинов. Он должен быть одномерным и монотонным.

правыйbool, необязательно

Указывает, включают ли интервалы правую или левую границу бина. По умолчанию (right==False) означает, что интервал не включает правую границу. Левая граница бина в этом случае открыта, т.е. bins[i-1] <= x < bins[i] — поведение по умолчанию для монотонно возрастающих бинов.

Возвращает:
индексыndarray целых чисел

Выходной массив индексов той же формы, что и x.

Вызывает:
ValueError

Если bins не является монотонным.

TypeError

Если тип ввода комплексный.

Смотрите также

bincount, histogram, unique, searchsorted

Примечания

Если значения в x таковы, что они выходят за пределы диапазона бинов, попытка индексирования bins с индексами, которые digitize возвращает приведёт к IndexError.

Новое в версии 1.10.0.

numpy.digitize реализован в терминах numpy.searchsortedЭто означает, что для бинирования значений используется бинарный поиск, который масштабируется гораздо лучше для большего количества бинов, чем предыдущий линейный поиск. Также снимается требование, чтобы входной массив был одномерным.

Для монотонно увеличивая bins, следующие выражения эквивалентны:

np.digitize(x, bins, right=True)
np.searchsorted(bins, x, side='left')

Обратите внимание, что поскольку порядок аргументов обратный, сторона также должна быть обратной. searchsorted вызов немного быстрее, так как не выполняет проверки монотонности. Возможно, более важно то, что он поддерживает все типы данных.

Примеры

>>> import numpy as np
>>> x = np.array([0.2, 6.4, 3.0, 1.6])
>>> bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])
>>> inds = np.digitize(x, bins)
>>> inds
array([1, 4, 3, 2])
>>> for n in range(x.size):
...   print(bins[inds[n]-1], "<=", x[n], "<", bins[inds[n]])
...
0.0 <= 0.2 < 1.0
4.0 <= 6.4 < 10.0
2.5 <= 3.0 < 4.0
1.0 <= 1.6 < 2.5
>>> x = np.array([1.2, 10.0, 12.4, 15.5, 20.])
>>> bins = np.array([0, 5, 10, 15, 20])
>>> np.digitize(x,bins,right=True)
array([1, 2, 3, 4, 4])
>>> np.digitize(x,bins,right=False)
array([1, 3, 3, 4, 5])