2015-06-26 2 views
1

У меня есть функция, которая возвращает Numpy массив целочисленных меток, например:Получить индексы наименее часто встречающихся значений в NumPy

labels_array = numpy.array([0, 0, 1, 1, 0, 1, 2, 3, 0, 2, 3,]) 

Этикетки всегда выполняются последовательно, начиная с 0.

Моя цель - найти индексы ярлыков в label_array, которые происходят наименее часто. Если в label_array есть несколько меток, удовлетворяющих этому условию, то я хочу получить все соответствующие индексы. Для приведенного выше примера, я получил бы

result= [6, 7, 9, 10] 

и не только [6]

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

occurrencePerLabel = numpy.bincount(labels_array) 
labels = numpy.where(occurrencePerLabel == occurrencePerLabel.min()) 

Теперь у меня есть

labels = (array([2, 3]),) 

говорил мне, что 2 и 3 являются метки, которые происходят менее часто в labels_array

Далее, мне нужно, чтобы получить показатели, на которых labels_array является 2 или 3, и это будет именно тот результат, который я ищу. В основном я ищу что-то вроде

labels_array.index(labels_array == labels) 

Как это сделать с numpy?

ответ

3
>>> np.where(np.in1d(labels_array, [2, 3]))[0] 
array([ 6, 7, 9, 10]) 
+0

Спасибо, я не знал о np.in1d, он делает именно то, что Ineed! – Darina

1

не очень, но это делает трюк ... numpy.nonzero(numpy.sum([labels_array == l for l in labels[0]], axis=0))

Смежные вопросы