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
Если тип ввода комплексный.
Смотрите также
Примечания
Если значения в 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])