Мы можем использовать 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
.