Индекс наибольшего значения подгруппой 2D-массива: argwhere.sort.max.group.sum (axis = 1)? - PullRequest
0 голосов
/ 18 февраля 2020

Допустим, у меня есть двумерный массив:

  a = np.random.randint(0,10,(20,5))

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

Так что в этом случае я хочу разделить 20 строк на 5 групп, получить сумму. (ось = 1) и выбрать максимум в группе.

После того, как у меня будет пять максимумов (для каждой группы), я хочу выбрать два индексы строк с самыми большими значениями (на основе исходного массива)

  a.sum(axis=1)
  ... get max in all 5 groups
  ... pick two biggest
  ... argwhere() of those two

  asum.reshape((4,5))

 array([[18, 27, 23, 18, 26],
   [34, 24, 23, 15, 30],
   [16, 26, 21, 24, 16],
   [21, 24, 29, 23, 23]])



  a.sum(axis=1).reshape((4,5)).argmax(axis=1)
  Out[55]: array([1, 0, 1, 2])

теперь мне нужно преобразовать их в одномерные индексы ..

  idxs = a.sum(axis=1).reshape((4,5)).argmax(axis=1) + np.arange(0,4) * 5
  array([ 1,  5, 11, 17])

теперь я должен выбрать два лучших, учитывая эти различия!?

хмм ... некрасиво ...

 : asum
 array([18, 27, 23, 18, 26, 34, 24, 23, 15, 30, 16, 26, 21, 24, 16, 21, 24, 29, 23, 23])

idxs[np.argsort(asum[idxs])][::-1][:2] 
array([ 5, 17])

1 Ответ

0 голосов
/ 18 февраля 2020
import numpy as np
a = np.random.randint(0,10,(20,5))
row_sums = a.sum(axis=1)

# array([30, 23, 13, 26, 17, 27, 29, 21, 16, 25, 21, 23, 38, 32, 23, 18, 16,
#        23, 16, 25])

Это решение позволяет избежать полной сортировки с помощью двоичной кучи:

N = 2
import heapq
index_and_max = heapq.nlargest(N, enumerate(row_sums), key=lambda x: x[1])

# list of tuple of index and value at index, of two largest
#[(12, 38), (13, 32)]

В противном случае вы можете использовать numpy массивы, встроенные в argsort

row_sums.argsort()[-2:]
# array([13, 12])
...