2010-12-04 3 views
2

Я использую следующий код, чтобы оцифровать массив в 16 бункеров:numpy.digitize возвращает значения вне диапазона?

numpy.digitize(array, bins=numpy.histogram(array, bins=16)[1]) 

Я ожидаю, что выход находится в диапазоне [1, 16], так как есть 16 бункеров. Однако одно из значений в возвращаемом массиве равно 17. Как это можно объяснить?

ответ

5

На самом деле это документально поведение numpy.digitize():

Каждый индекс i возвращается таково, что, если bins[i-1] <= x < bins[i] bins монотонно возрастает, или, если bins[i-1] > x >= bins[i] bins монотонно убывает. Если значения в x находятся за пределами , границы bins, 0 или len(bins) возвращаются соответственно.

Так что в вашем случае 0 и 17 также допустимые значения возврата (обратите внимание, что массив бен возвращаемый numpy.histogram() имеет длину 17). Бутылки, возвращенные numpy.histogram(), охватывают диапазон array.min() до array.max(). Условие, указанное в документах, показывает, что array.min() принадлежит к первому ящику, а array.max() лежит за пределами последнего бункера - поэтому 0 не находится на выходе, а 17 -.

+0

Хм, я знаю о поведение граничного оцифровки(). Однако, поскольку я использую гистограмму() для создания бункеров, не все ли значения лежат внутри бункеров? – sandesh247 2010-12-04 23:18:23

2

numpy.histogram() производит массив бункера ребра, из которых (number of bins)+1.

1

В numpy версии 1.8. Вы можете выбрать, хотите ли вы numpy.digitize рассмотреть интервал, который нужно закрыть или открыть. Ниже приведен пример (копируется из http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html)

х = np.array ([1,2, 10,0, 12,4, 15,5, 20])

бункеров = np.array ([0,5,10, 15,20])

np.digitize (х, бункеров, вправо = True)

массив ([1, 2, 3, 4, 4])