numpy.digitize Возвращает значения вне диапазона?
-
08-10-2019 - |
Вопрос
Я использую следующий код для оцифровки массива на 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])