您可以按照this answer on SO 中的建议多次使用numpy.argsort 来处理矩阵。
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]])
什么是秩矩阵?
总而言之,如果我要取出矩阵中的所有整数,并将它们从小到大排序,然后为每个整数分配一个从 0 到 9 的 rank,这将产生秩矩阵。请注意,最小的是 0,排名为 0,而最大的是 19,排名最后为 9。
双 argsort 的工作原理
#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做了什么。 它获取每个元素的位置,并在排序后将它们放在它们所属的位置。知道了这一点,我们就可以编写一个本质上是三角形的后向逻辑。让我们从 sort2 开始,然后是 sort1,然后是数组。
-
0th(在 sort2 中)是 4th(在 sort1 中),4th(在 sort1 中)是 0th(在数组中)。所以0th(在数组中)是0th(在sort2中)
-
9th(在 sort2 中)是 1st(在 sort1 中),1st(在 sort1 中)是 9th(在数组中)。所以,9th(在数组中)是9th(在 sort2 中)
-
6th(在 sort2 中)是 9th(在 sort1 中),9th(在 sort1 中)是 6th(在数组中)。所以,6th(在数组中)是6th(在 sort2 中)
把你的头绕进去有点令人困惑,但是一旦你理解了 argsort() 的工作原理,你就不应该有问题。