Ниже приведен подход с использованием np.argpartition
-
idx = np.argpartition(a,range(M))[:,:-M-1:-1] # topM_ind
out = a[np.arange(a.shape[0])[:,None],idx] # topM_score
Прогон образца -
In [343]: a
Out[343]:
array([[ 1. , 0.3, 0.4],
[ 0.2, 0.6, 0.8],
[ 0.1, 0.3, 0.5]])
In [344]: M = 2
In [345]: idx = np.argpartition(a,range(M))[:,:-M-1:-1]
In [346]: idx
Out[346]:
array([[0, 2],
[2, 1],
[2, 1]])
In [347]: a[np.arange(a.shape[0])[:,None],idx]
Out[347]:
array([[ 1. , 0.4],
[ 0.8, 0.6],
[ 0.5, 0.3]])
Альтернативно, возможно, медленнее, но немного короче код для получения idx
будет с np.argsort
-
idx = a.argsort(1)[:,:-M-1:-1]
Вот post
, содержащий некоторый тест времени выполнения, который сравнивает np.argsort
и np.argpartition
с подобная проблема.