假设我有一个数组:
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 数组呢?但似乎 < 无法广播。
假设我有一个数组:
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 数组呢?但似乎 < 无法广播。
方法#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])