2016-07-08 517 views
0

相关的How to get indices of N maximum values in a numpy array?,我有一个numpy的矩阵a,我想以产生其 -th行是a第行的顶部Ñ元素的列索引的阵列。如何在numpy矩阵的每一行获得N个最大值的索引矩阵?

继得票最多的答案的链接的问题,适应它为阵,这里是我迄今(使用ñ = 4):

>>> a 
array([[9, 4, 4, 3, 3, 9, 0, 4, 6, 0], 
     [3, 4, 6, 9, 5, 7, 1, 2, 8, 4]]) 
>>> ind=np.argpartition(a,-4)[:,-4:] 
>>> ind 
array([[1, 5, 8, 0], 
     [2, 3, 8, 5]]) 
>>> rows=np.transpose([np.arange(a.shape[0])]) 
>>> rows 
array([[0], 
     [1]]) 
>>> ind_sorted = ind[rows,np.argsort(a[rows,ind])] 
>>> ind_sorted 
array([[1, 8, 5, 0], 
     [2, 5, 8, 3]]) 

这工作,但似乎是不是很(python)的。我确信有一个更好的方法来做不需要虚拟数组的索引。有什么建议么?

回答

1

切片按行的顺序索引的最后四个元素似乎是工作:

a.argsort(axis = 1)[:, -4:] 

# array([[7, 8, 0, 5], 
#  [2, 5, 8, 3]]) 

领带方法没有限定,因此会出现的顺序17之间的一些差异以及05

+0

感谢您的回答。我想要'argpartition'方法,因为我担心排序整个矩阵的时间(大约150x150)。我应该,还是那种过早的优化? –

+0

如果你的矩阵是150 * 150的尺寸,我不会担心时间。据说,如果提供的话,排序算法应该针对任何高级语言进行优化,我相信。 – Psidom