Вопрос

Я использую следующий код для оцифровки массива на 16 BINS:

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

x = np.array ([1.2, 10.0, 12.4, 15,5, 20.])

BINS = NP.ARRAY ([0,5,10,15,20])

np.digitize (x, bins,право = правда)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top