Основное голосование по колонке? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть двумерный массив 20x20, из которого я хочу получить для каждого столбца значение с наибольшим числом встречающихся (исключая нули), то есть значение, которое получает основной голос.

Я могу это сделатьдля одного столбца, подобного этому:

 : np.unique(p[:,0][p[:,0] != 0],return_counts=True)
 : (array([ 3, 21], dtype=int16), array([1, 3]))

 : nums, cnts = np.unique(p[:,0][ p[:,0] != 0 ],return_counts=True)
 : nums[cnts.argmax()]
 : 21

Просто для полноты мы можем расширить ранее предложенный метод до решения на основе цикла для двумерных массивов -

# p is 2D input array
for i in range(p.shape[1]):
    nums, cnts = np.unique(p[:,i][ p[:,i] != 0 ],return_counts=True)
    output_per_col = nums[cnts.argmax()]

Как мне сделатьчто для всех столбцов без использования для цикла?

1 Ответ

1 голос
/ 25 сентября 2019

Мы можем использовать bincount2D_vectorized, чтобы получить количество бинов в столбце, где каждый бин будет целым числом.Затем просто вырежьте второй отсчет и далее (как при первом подсчете 0) и получите argmax, добавьте 1 (чтобы компенсировать срезы).Это наш желаемый результат.

Следовательно, решение, показанное в качестве примера выполнения -

In [116]: p # input array
Out[116]: 
array([[4, 3, 4, 1, 1, 0, 2, 0],
       [4, 0, 0, 0, 0, 0, 4, 0],
       [3, 1, 3, 4, 3, 1, 4, 3],
       [4, 4, 3, 3, 1, 1, 3, 2],
       [3, 0, 3, 0, 4, 4, 4, 0],
       [3, 0, 0, 3, 2, 0, 1, 4],
       [4, 0, 3, 1, 3, 3, 2, 0],
       [3, 3, 0, 0, 2, 1, 3, 1],
       [2, 4, 0, 0, 2, 3, 4, 2],
       [0, 2, 4, 2, 0, 2, 2, 4]])

In [117]: bincount2D_vectorized(p.T)[:,1:].argmax(1)+1
Out[117]: array([3, 3, 3, 1, 2, 1, 4, 2])

Это транспонирование необходимо, потому что bincount2D_vectorized дает нам 2D привязки на строку.Таким образом, для альтернативной проблемы получения рангов в ряду, просто пропустите транспонирование.

Кроме того, не стесняйтесь исследовать другие варианты в этих связанных вопросах и ответах, чтобы получить 2D-bincounts.

...