如何获得 numpy 二维数组中列的排名?
How to get the rank of a column in numpy 2d array?
假设我有一个数组:
a = np.array([[1,2,3,4],
[4,2,5,6],
[6,5,0,3]])
我想获取每行第 0 列的排名(即 np.array([0, 1, 3])
),有什么捷径可以做到这一点吗?
在一维数组中,我可以使用 np.sum(a < a[0])
来执行此操作,但是二维数组呢?不过好像<不能播。
方法 #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])
假设我有一个数组:
a = np.array([[1,2,3,4],
[4,2,5,6],
[6,5,0,3]])
我想获取每行第 0 列的排名(即 np.array([0, 1, 3])
),有什么捷径可以做到这一点吗?
在一维数组中,我可以使用 np.sum(a < a[0])
来执行此操作,但是二维数组呢?不过好像<不能播。
方法 #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])