您可以使用numpy.argsort
多次处理矩阵,如建议的那样这个答案关于SO https://stackoverflow.com/questions/17814502/rank-values-in-a-2d-array.
import numpy as np
inp = np.array([[9,4,15,0,18],
[16,19,8,10,1]])
inp.ravel().argsort().argsort().reshape(inp.shape)
array([[4, 2, 6, 0, 8],
[7, 9, 3, 5, 1]])
什么是秩矩阵?
总之,如果我要取出矩阵中的所有整数,并将它们从小到大排序,然后为每个整数分配一个rank
从 0 到 9,这将产生排名矩阵。请注意,最小的是 0,它的排名为 0,而最大的是 19,它的最后排名为 9。
双参数排序如何工作
#printing them so they align nicely
print('Array ->', end='')
for i in inp.ravel().astype('str'):
print(i.center(4), end='')
print('\n')
print('Sort1 ->', end='')
for i in inp.ravel().argsort().astype('str'):
print(i.center(4), end='')
print('\n')
print('Sort2 ->', end='')
for i in inp.ravel().argsort().argsort().astype('str'):
print(i.center(4), end='')
Array -> 9 4 15 0 18 16 19 8 10 1
Sort1 -> 3 9 1 7 0 8 2 5 4 6
Sort2 -> 4 2 6 0 8 7 9 3 5 1
我们先来总结一下什么argsort
does. 它获取每个元素的位置,并在排序后将它们放在它们所属的位置。知道了这一点,我们就可以编写一个本质上是三角形的后向逻辑。让我们从 sort2 开始,然后是 sort1,然后是 array。
-
0th
(在排序2中)是4th
(在排序1中),4th
(在排序1中)是0th
(在数组中)。所以0th
(在数组中)是0th
(在排序2中)
-
9th
(在排序2中)是1st
(在排序1中),1st
(在排序1中)是9th
(在数组中)。所以,9th
(在数组中)是9th
(在排序2中)
-
6th
(在排序2中)是9th
(在排序1中),9th
(在排序1中)是6th
(在数组中)。所以,6th
(在数组中)是6th
(在排序2中)
理解它有点令人困惑,但是一旦您理解了 argsort() 的工作原理,就不会有问题了。