如何在Python中使用OpenCV SortIdx()?

如何在Python中使用OpenCV SortIdx()?,python,sorting,opencv,Python,Sorting,Opencv,我是OpenCV的新手,我在其Python版本中使用了它。我的问题是,我需要对一个矩阵进行排序,我找到了方法sortIdx(),它似乎解决了我的问题,但我不知道如何使用它。我有以下代码: matr=np.array([ [6,8,5,12], [2,1,10,9], [3,4,11,7] ]) sorted_matr=cv2.sortIdx(matr,cv2.SORT_EVERY_COLUMN|cv2.SOR

我是OpenCV的新手,我在其Python版本中使用了它。我的问题是,我需要对一个矩阵进行排序,我找到了方法sortIdx(),它似乎解决了我的问题,但我不知道如何使用它。我有以下代码:

matr=np.array([
            [6,8,5,12],
            [2,1,10,9],
            [3,4,11,7]
        ])
sorted_matr=cv2.sortIdx(matr,cv2.SORT_EVERY_COLUMN|cv2.SORT_ASCENDING)
print(sorted_matr)
它给了我以下结果:

[[1 1 0 2]
 [2 2 1 1]
 [0 0 2 0]]
当我希望像这样(我不是在寻找m-1元素,这只是一个例子):

无论如何,我只想知道如何在Python中使用<代码> SoTrxx<代码>(我只在C++中找到文档,在第二个参数中接收函数,一个新的矩阵…)来排序矩阵,以及如何使用这个新的顺序。


谢谢大家

对于基本矩阵运算,NumPy可能是比OpenCV更好的选择。OpenCV只能对行或列进行独立排序,而可以在排序之前展平矩阵(
axis=None
):

结果是

[[ 1,  2,  3,  4],
 [ 5,  6,  7,  8],
 [ 9, 10, 11, 12]]
或者,下面的代码使用索引进行排序给出相同的结果:(对应于OpenCV的sortIdx)

注意:这里的
排序\u idxs
[5,4,8,9,2,0,11,1,7,6,10,3]
,与您的问题不匹配,因为它们用于排序,而不是为每个元素提供排名

sorted_matr = np.sort(matr, axis=None).reshape(matr.shape)
[[ 1,  2,  3,  4],
 [ 5,  6,  7,  8],
 [ 9, 10, 11, 12]]
sort_idxs = np.argsort(matr, axis=None)
sorted_matr = matr.flatten()[sort_idxs].reshape(matr.shape)