如何在numpy 2d数组中获得列的排名?

时间:2016-08-25 08:39:37

标签: python arrays numpy ranking numpy-broadcasting

假设我有一个数组:

a = np.array([[1,2,3,4],
              [4,2,5,6],
              [6,5,0,3]])

我想在每一行中得到第0列的等级(即np.array([0, 1, 3])),有没有简短的方法可以做到这一点?

在1d数组中我可以用np.sum(a < a[0])来做这个,但是2d数组怎么样?但似乎&lt;不能播出。

1 个答案:

答案 0 :(得分:3)

方法#1

沿着行使用np.argsort并查找与第一列对应的索引0,以便为我们提供与输入数组相同形状的掩码。最后,获取掩码中匹配的列索引(True)以获得所需的排名输出。因此,实施将是 -

np.where(a.argsort(1)==0)[1]

方法#2

另一种获取所有列的排名的方法是对早期方法的略微修改。实现看起来像这样 -

(a.argsort(1)).argsort(1)

因此,要获得第一列的等级,请将其索引到第一列,如此 -

(a.argsort(1)).argsort(1)[:,0]

示例运行

In [27]: a
Out[27]: 
array([[1, 2, 3, 4],
       [4, 2, 5, 6],
       [6, 5, 0, 3]])

In [28]: np.where(a.argsort(1)==0)[1]
Out[28]: array([0, 1, 3])

In [29]: (a.argsort(1)).argsort(1) # Ranks for all cols
Out[29]: 
array([[0, 1, 2, 3],
       [1, 0, 2, 3],
       [3, 2, 0, 1]])

In [30]: (a.argsort(1)).argsort(1)[:,0] # Rank for first col
Out[30]: array([0, 1, 3])

In [31]: (a.argsort(1)).argsort(1)[:,1] # Rank for second col
Out[31]: array([1, 0, 2])