2

假设我有一个数组:

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

我想获得每行(即np.array([0, 1, 3]))中第 0 列的排名,有没有捷径可以做到这一点?

在 1d 数组中,我可以使用它np.sum(a < a[0])来执行此操作,但是 2d 数组呢?但似乎 < 无法广播。

4

1 回答 1

4

方法#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])
于 2016-08-25T08:41:43.810 回答