Получить индексы N наивысших значений в ndarray

Учитывая гистограмму формы 100x100x100, я хотел бы найти два самых высоких значения a и b и их индексы (a1, a2, a3) и (b1, b2, b3), такие как:

hist[a1][a2][a3] = a hist[b1][b2][b3] = b 

Мы можем легко получить наибольшее значение с помощью hist.max (), но как мы можем получить самые высокие значения X в ndarray?

Я понимаю, что обычно используется np.argmax для извлечения индексов значений, но в этом случае:

 hist.argmax().shape = () # single value for i in range(3): hist.argmax(i).shape = (100, 100) 

Как я могу получить форму (3), кортеж с одним значением для измерения?

3 Solutions collect form web for “Получить индексы N наивысших значений в ndarray”

Вы можете использовать numpy.argpartition на сплющенной версии массива сначала, чтобы получить индексы элементов верхнего k , а затем вы можете преобразовать эти 1D-индексы в соответствии с формой массива с помощью numpy.unravel_index :

 >>> arr = np.arange(100*100*100).reshape(100, 100, 100) >>> np.random.shuffle(arr) >>> indices = np.argpartition(arr.flatten(), -2)[-2:] >>> np.vstack(np.unravel_index(indices, arr.shape)).T array([[97, 99, 98], [97, 99, 99]]) ) >>> arr[97][99][98] 999998 >>> arr[97][99][99] 999999 

Вы можете использовать:

 a=np.random.random((100,100,100)) np.where(a==a.max()) (array([46]), array([62]), array([61])) 

чтобы попасть в один массив:

 np.hstack(np.where(a==a.max())) array([46, 62, 61]) 

и, поскольку ОП попросил кортеж:

 tuple(np.hstack(np.where(a==a.max()))) (46, 62, 61) 

РЕДАКТИРОВАТЬ:

Чтобы получить индексы N наибольших наборов, вы можете использовать самую nlargest функцию из модуля nlargest :

 N=3 np.where(a>=heapq.nlargest(3,a.flatten())[-1]) (array([46, 62, 61]), array([95, 85, 97]), array([70, 35, 2])) 

Я полагаю, вы можете это сделать:

(Псевдокод)

 #work on a copy working_hist = copy(hist) greatest = [] min_value = hist.argmin().shape #while searching for the N greatest values, do N times for i in range(N): #get the current max value max_value = hist.argmax().shape #save it greatest.append(max_value) #and then replace it by the minimum value hist(max_value.shape)= min_value 

Я не использовал numpy в течение многих лет, поэтому я не уверен в синтаксисе. Код здесь только для того, чтобы дать вам псевдокод вроде ответа.

Если вы сохраните также положение извлекаемого вами значения, вы можете избежать работы с копией элемента, используя извлеченную информацию для восстановления матрицы в конце.

  • Экспоненциальная подгонка кривой в SciPy
  • ImportError:: Символ не найден: __PyErr_ReplaceException
  • Как превратить логический массив в индексный массив в numpy
  • Эффективное применение функции по перемещению окна numpy array
  • Полярный контурный график в matplotlib - лучший (современный) способ сделать это?
  • Уменьшение дискретизации большого 3D-изображения в numpy
  • FFT в numpy vs FFT в MATLAB не имеют одинаковых результатов
  • Использование ufunc.at на матрице
  • Python - лучший язык программирования в мире.